Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Perl > looping/incrementing problem...

Reply
Thread Tools

looping/incrementing problem...

 
 
Mothra
Guest
Posts: n/a
 
      12-09-2003
Here's what I'm trying to do (kill off old Unix logins):

---------------------
$i=0;
while (<$who>) {
chomp($_);
my @line = split(/\s+/, $_); # Split it into an array
next unless ($line[5] eq "old");
push @{$oldsessions[$i]}, @line;
$i++;
}
---------------------

Which is fine unless you have strict pragma on, which i always do,
becuase then $i isn't locally defined within the loop. Is there a way I
can combine reading in the contents of $who with an incrementing $i all
within the same scope? Or is there a better way than using $i. Bear in
mind that @oldsessions is an array of annoymous arrays.

Here is the whole code to put it in context...

---------------------
use strict;
use IO:ipe;

my @oldsessions;
my $who=IO:ipe->new;
$who->reader('/usr/bin/who', '-u');

$i=0;
while (<$who>) {
chomp($_);
my @line = split(/\s+/, $_); # Split it into an array
next unless ($line[5] eq "old");
push @{$oldsessions[$i]}, @line;
$i++;
}

print "The following sessions are older than 24 hours:\n";

for($i=0; $i<=@oldsessions; $i++) {
print join(' ', @{$oldsessions[$i]}) . "\n";
}

print "Terminate them? (y/N): ";
chomp($a=<STDIN>);
unless($a eq "y"){
print "Exited without killing any sessions.\n";
exit(0);
}

$i=0;
for($i=0; $i<=@oldsessions; $i++) {
print "Killing $oldsessions[$i][0], Process ID $oldsessions[$i]
[6]" . "\n";
}

 
Reply With Quote
 
 
 
 
David
Guest
Posts: n/a
 
      12-09-2003
Mothra <(E-Mail Removed)> wrote in message news:<WplBb.2619157$(E-Mail Removed)>.. .

> $i=0;
> while (<$who>) {
> chomp($_);
> my @line = split(/\s+/, $_); # Split it into an array
> next unless ($line[5] eq "old");
> push @{$oldsessions[$i]}, @line;
> $i++;
> }


[snip]

> Is there a way I can combine reading in the contents of $who with
> an incrementing $i all within the same scope? Or is there a better
> way than using $i.


You could also use Perl's input line number variable, $., instead of
manually incrementing $i:

while (<$who>) {
chomp;
my @line = split;
next unless $line[5] eq 'old';
$oldsessions[$.] = \@line;
}

> Bear in mind that @oldsessions is an array of annoymous arrays.


Sure thing. FWIW, I was actually a little confused about the way you
added to @oldsessions:

> push @{$oldsessions[$i]}, @line;


I personally don't like using 'push' when a simple assignment would
do:

@{ $oldsessions[$.] } = @line;

You could even do something that looks cleaner, IMHO:

$oldsessions[$.] = \@line;

Cheers,
David
 
Reply With Quote
 
 
 
 
Gunnar Hjalmarsson
Guest
Posts: n/a
 
      12-09-2003
Mothra wrote:
>
> $i=0;
> while (<$who>) {
> chomp($_);
> my @line = split(/\s+/, $_); # Split it into an array
> next unless ($line[5] eq "old");
> push @{$oldsessions[$i]}, @line;
> $i++;
> }


<snip>

> Is there a way I can combine reading in the contents of $who with
> an incrementing $i all within the same scope?


Do you mean like this:

push @{$oldsessions[$i++]}, @line;

--
Gunnar Hjalmarsson
Email: http://www.gunnar.cc/cgi-bin/contact.pl

 
Reply With Quote
 
axs
Guest
Posts: n/a
 
      12-10-2003
{
$i=0;
while (<$who>) {
chomp($_);
my @line = split(/\s+/, $_); # Split it into an array
next unless ($line[5] eq "old");
push @{$oldsessions[$i]}, @line;
$i++;
}
}

Mothra <(E-Mail Removed)> wrote in message news:<WplBb.2619157$(E-Mail Removed)>.. .
> Here's what I'm trying to do (kill off old Unix logins):
>
> ---------------------
> $i=0;
> while (<$who>) {
> chomp($_);
> my @line = split(/\s+/, $_); # Split it into an array
> next unless ($line[5] eq "old");
> push @{$oldsessions[$i]}, @line;
> $i++;
> }
> ---------------------
>
> Which is fine unless you have strict pragma on, which i always do,
> becuase then $i isn't locally defined within the loop. Is there a way I
> can combine reading in the contents of $who with an incrementing $i all
> within the same scope? Or is there a better way than using $i. Bear in
> mind that @oldsessions is an array of annoymous arrays.
>
> Here is the whole code to put it in context...
>
> ---------------------
> use strict;
> use IO:ipe;
>
> my @oldsessions;
> my $who=IO:ipe->new;
> $who->reader('/usr/bin/who', '-u');
>
> $i=0;
> while (<$who>) {
> chomp($_);
> my @line = split(/\s+/, $_); # Split it into an array
> next unless ($line[5] eq "old");
> push @{$oldsessions[$i]}, @line;
> $i++;
> }
>
> print "The following sessions are older than 24 hours:\n";
>
> for($i=0; $i<=@oldsessions; $i++) {
> print join(' ', @{$oldsessions[$i]}) . "\n";
> }
>
> print "Terminate them? (y/N): ";
> chomp($a=<STDIN>);
> unless($a eq "y"){
> print "Exited without killing any sessions.\n";
> exit(0);
> }
>
> $i=0;
> for($i=0; $i<=@oldsessions; $i++) {
> print "Killing $oldsessions[$i][0], Process ID $oldsessions[$i]
> [6]" . "\n";
> }

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off




Advertisments