looping/incrementing problem...

M

Mothra

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::pipe;

my @oldsessions;
my $who=IO::pipe->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";
}
 
D

David

Mothra said:
$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
 
G

Gunnar Hjalmarsson

Mothra said:
$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++;
}

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;
 
A

axs

{
$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++;
}
}
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
474,123
Messages
2,570,718
Members
47,284
Latest member
LeroyOlver

Latest Threads

Top