on Tue, 11 Jun 2002 13:17:57 GMT, [EMAIL PROTECTED]
(David Vd Geer Inhuur Tbv Iplib) wrote:
> I am currently almost done with my current job.
> As I am reviewing my scripts the foreach-loop started to anoy me.
>
> I am afraid this is slowing down the script. Does anyone know a
> faster way to do the following :
Here's how I would do it:
#! perl -w
use strict; # not after the facts, but from the start
# $pwuser set before. Purpose - find corresponding $group
while (<DATA>) {
my ($group, @users) = split /[:\s]+/;
$groups{$_} = $group for (@users);
}
my %translation = ( htuser => 'iclab',
phil => 'phil',
all => 'all' );
my $group = $translation{$groups{$pwuser}} || "none";
print "$pwuser - $group\n";
__DATA__
htuser: user1 user2 user3 manyothers
phil: user4 user5 manymore
all: external1 external2 etc
Some comments on your code follows:
> open(FH, "< $groupfile");
Always check the return value of a system call.
> @usrs = <FH>;
> close FH;
>
> $htusr = (grep {/htuser: /} @usrs)[0] ;
> $phi = (grep {/phil: /} @usrs)[0] ;
> $al = (grep {/all: /} @usrs)[0] ;
Look at the repeating (hardcoded) patterns which are repeated
throughout the program, hence your 'bad feeling about the repeating
foreach's'.
>
> @htuser = split(/ /, $htusr);
> @phil = split(/ /, $phi);
> @all = split(/ /, $al);
>
> foreach $htuser(@htuser) {
> chomp $htuser;
> if ( "$pwuser" eq "$htuser" ) { $group = "iclab"; }
Don't put quotes around single variables.
> }
> foreach $phil(@phil) {
> chomp $phil;
> if ( "$pwuser" eq "$phil" ) { $group = "phil"; }
> }
> foreach $all(@all) {
> chomp $all;
> if ( "$pwuser" eq "$all" ) { $group = "all"; }
> }
> if(!($group)) { $group = "none"; }
More 'Perl-like':
$group || = 'none';
> I know I should have used Strict,
> [...]
> It's only a pain to correct it afterwards :(
That's why you should start with it from the beginning.
--
felix
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]