Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I know if diamond operator moved to the next file?

I have the following code in a file perl_script.pl:

while (my $line = <>) {
    chomp $line;
   // etc. 
}. 

I call the script with more than 1 file e.g.

perl perl_script.pl file1.txt file2.txt

Is there a way to know if the $line is started to read from file2.txt etc?

like image 740
Jim Avatar asked Dec 01 '22 13:12

Jim


1 Answers

The $ARGV variable

Contains the name of the current file when reading from <>

and you can save the name and test on every line to see if it changed, updating when it does.

If it is really just about getting to a specific file, as the question seems to say, then it's easier since you can also use @ARGV, which contains command-line arguments, to test directly for the needed name.


One other option is to use eof (the form without parenthesis!) to test for end of file so you'll know that the next file is coming in the next iteration -- so you'll need a flag of some sort as well.

A variation on this is to explicitly close the filehandle at the end of each file so that $. gets reset for each new file, what normally doesn't happen for <>, and then $. == 1 is the first line of a newly opened file

while (<>) { 
    if ($. == 1) { say "new file: $ARGV" }
} 
continue { 
    close ARGV if eof;
} 
like image 75
zdim Avatar answered Dec 06 '22 10:12

zdim