For Programmers: Free Programming Magazines  


Home > Archive > PERL Beginners > February 2005 > Diamond Operator and Filenames









You are viewing an archived Text-only version of the thread. To view this thread in it's original format and/or if you want to reply to this thread please [click here]

 

Author Diamond Operator and Filenames
Errin M HMMA/IT Larsen

2005-02-18, 8:55 pm

Hi Perl-Crunchers,

I've got the following code:

#!/usr/bin/perl

use warnings;
use strict;

my $logdir =3D '/some/application/logs';
my @logs =3D <$logdir/*>;

push @ARGV, @logs;
while( <> ) {
print "$filename:\n$_" if( /with errors/ );
}

Of course, my problem is that I'm not filling in $filename in that print
statement with a value. I'd really like to be able to put the name of
the file the diamond ('<>') operator is currently parsing in there. Is
that possible? Do I have access to the individual filenames AS they are
being used in the while statement?

Thanks ahead of time,

--Errin
Wagner, David --- Senior Programmer Analyst --- WG

2005-02-18, 8:55 pm

Larsen, Errin M HMMA/IT wrote:
> Hi Perl-Crunchers,
>=20
> I've got the following code:
>=20
> #!/usr/bin/perl
>=20
> use warnings;
> use strict;
>=20
> my $logdir =3D '/some/application/logs';
> my @logs =3D <$logdir/*>;
>=20
> push @ARGV, @logs;
> while( <> ) {
> print "$filename:\n$_" if( /with errors/ );
> }
>=20
> Of course, my problem is that I'm not filling in $filename in that
> print statement with a value. I'd really like to be able to put the
> name of the file the diamond ('<>') operator is currently parsing in
> there. Is that possible? Do I have access to the individual
> filenames AS they are being used in the while statement?
>=20
> Thanks ahead of time,
>=20
> --Errin


I believe that $ARGV[0] has the file being processed. So I think you could=
do something like:

if ( $. =3D=3D 1 ) { # on the first read of the current file
print "Filename: " . $ARGV[0] . "\n";
}

Wags ;)


****************************************
***************
This message contains information that is confidential
and proprietary to FedEx Freight or its affiliates.
It is intended only for the recipient named and for
the express purpose(s) described therein.
Any other use is prohibited.
****************************************
***************

Errin M HMMA/IT Larsen

2005-02-18, 8:55 pm

> Larsen, Errin M HMMA/IT wrote:

<<CODE SNIPPED>>
[color=darkred]
> to put the=20
> parsing in=20
>=20
> I believe that $ARGV[0] has the file being processed.=20
> So I think you could do something like:
>=20
> if ( $. =3D=3D 1 ) { # on the first read of the current file
> print "Filename: " . $ARGV[0] . "\n";
> }
>=20
> Wags ;)



Hi again,

So, the <> operator shift()s the filenames off the top of @ARGV?
That's usefull knowledge.

On a side note, out of curiosity, can I manipulate the @ARGV array
inside the while loop? Or will that cause "unexpected behaviour"?

--Errin=20
Wagner, David --- Senior Programmer Analyst --- WG

2005-02-18, 8:55 pm

Larsen, Errin M HMMA/IT wrote:
>=20
> <<CODE SNIPPED>>
>=20
>=20
>=20
> Hi again,
>=20
> So, the <> operator shift()s the filenames off the top of @ARGV?
> That's usefull knowledge.
>=20
> On a side note, out of curiosity, can I manipulate the @ARGV array
> inside the while loop? Or will that cause "unexpected behaviour"?
>=20
> --Errin

As they say, ALL things are possbile ( in Perl ), but one would want to be=
careful, though you can change, delete and splice @ARGV like any other arr=
ay.

Wags ;)


****************************************
***************
This message contains information that is confidential
and proprietary to FedEx Freight or its affiliates.
It is intended only for the recipient named and for
the express purpose(s) described therein.
Any other use is prohibited.
****************************************
***************

John W. Krahn

2005-02-18, 8:55 pm

Larsen, Errin M HMMA/IT wrote:
> Hi Perl-Crunchers,


Hello,

> I've got the following code:
>
> #!/usr/bin/perl
>
> use warnings;
> use strict;
>
> my $logdir = '/some/application/logs';
> my @logs = <$logdir/*>;
>
> push @ARGV, @logs;
> while( <> ) {
> print "$filename:\n$_" if( /with errors/ );
> }
>
> Of course, my problem is that I'm not filling in $filename in that print
> statement with a value. I'd really like to be able to put the name of
> the file the diamond ('<>') operator is currently parsing in there. Is
> that possible? Do I have access to the individual filenames AS they are
> being used in the while statement?


The "magical" diamond operator uses ARGV as the current filehandle and stores
the name of the current file in the scalar $ARGV so:

while( <> ) {
print "$ARGV:\n$_" if /with errors/;
}




John
--
use Perl;
program
fulfillment
John W. Krahn

2005-02-18, 8:55 pm

Wagner, David --- Senior Programmer Analyst --- WGO wrote:
> Larsen, Errin M HMMA/IT wrote:
>
>
>
> I believe that $ARGV[0] has the file being processed.


No, the array @ARGV doesn't change inside the while loop.


John
--
use Perl;
program
fulfillment
Wagner, David --- Senior Programmer Analyst --- WG

2005-02-18, 8:55 pm

John W. Krahn wrote:
> Wagner, David --- Senior Programmer Analyst --- WGO wrote:
>=20
> No, the array @ARGV doesn't change inside the while loop.
>=20
>=20
> John
> --
> use Perl;
> program
> fulfillment


Corrct, though the variable $ARGV holds the current file being processed i=
n <>, So you can see by doing something like:

use strict;
use warnings;

printf "Scalar of ARGV: %d\n", scalar(@ARGV);

my $MyCurrFile =3D '';

while ( <> ) {
if ( $ARGV ne $MyCurrFile ) {
print "Filename: " . $ARGV . "\n";
$MyCurrFile =3D $ARGV
}
}

Tested and I had 13 files and 13 printed out.

I apolgize for the mistake on @ARGV, though if not used in regards to the =
<>, you can shift, pop, etc like anyother array element.

Wags


****************************************
***************
This message contains information that is confidential
and proprietary to FedEx Freight or its affiliates.
It is intended only for the recipient named and for
the express purpose(s) described therein.
Any other use is prohibited.
****************************************
***************

John W. Krahn

2005-02-18, 8:55 pm

Larsen, Errin M HMMA/IT wrote:
>
> So, the <> operator shift()s the filenames off the top of @ARGV?
> That's usefull knowledge.


Yes, but it does it before the loop starts!

$ perl -le'

print for @ARGV;

print;

while (<> ) { print "$ARGV\t$ARGV[0]" if $. == 1; close ARGV if eof }

print;
print for @ARGV;
' test04.txt test05.txt test06.txt
test04.txt
test05.txt
test06.txt

test04.txt test05.txt
test05.txt test06.txt
test06.txt


You can see that the current file name has already been removed from @ARGV
inside the while loop.


> On a side note, out of curiosity, can I manipulate the @ARGV array
> inside the while loop? Or will that cause "unexpected behaviour"?


Yes you can if you *REALLY* want to do that.



John
--
use Perl;
program
fulfillment
John W. Krahn

2005-02-18, 8:55 pm

John W. Krahn wrote:
> Wagner, David --- Senior Programmer Analyst --- WGO wrote:
>
>
> No, the array @ARGV doesn't change inside the while loop.


Sorry, see my other post which shows that @ARGV does indeed change.


John
--
use Perl;
program
fulfillment
Sponsored Links







Also available: Server administration forum archive | Web Design forum archive | Software forum archive | Hardware reviews archive

Copyright 2008 codecomments.com