Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister
 
PerlMonks  

Re^4: File Reading and Closing confusion

by repellent (Priest)
on Aug 09, 2010 at 03:49 UTC ( #853722=note: print w/ replies, xml ) Need Help??


in reply to Re^3: File Reading and Closing confusion
in thread File Reading and Closing confusion

I was referring to being wary when $line=<FH> is used on its own. To illustrate:

$ perl -e 'print "with_ending\nno_ending"' > a.txt $ perl -MData::Dumper open(FH, "<", "a.txt") or die $!; my $line1 = <FH>; my $line2 = <FH>; my $line3 = <FH>; close FH; $Data::Dumper::Useqq = 1; print Dumper [$line1, $line2, $line3]; __END__ $VAR1 = [ "with_ending\n", "no_end", undef ];

We see that there is a possibility that a line read ($line3 in this case) may return undef. That's what I meant: we need to be wary that a line read will not always return defined.


Comment on Re^4: File Reading and Closing confusion
Select or Download Code
Re^5: File Reading and Closing confusion
by shmem (Canon) on Aug 09, 2010 at 09:30 UTC
    I was referring to being wary when $line=<FH> is used on its own.

    Yes, but while takes care of that - and we/you were talking about a while loop, weren't you?

    1.    while (<>) {
    ...
    
    which is Perl short-hand for the more explicitly written version:
    1.    LINE: while (defined($line = <ARGV>)) {
    ...
    

    But of course,

    We see that there is a possibility that a line read ($line3 in this case) may return undef.

    - if you read past EOF, for instance. Then readline returns undef:

    open(FH, "<", "a.txt") or die $!; my $line1 = <FH>; my $line2 = <FH>; print "eof!\n" if eof FH; my $line3 = <FH>; close FH; __END__ eof!
    That's what I meant: we need to be wary that a line read will not always return defined.

    That's exactly the condition when both the while($line = <FH>) { } and while(defined($line = <FH>)) { } loops terminate, so there's no difference in a while loop.

        Yes, but while takes care of that - and we/you were talking about a while loop, weren't you?

      Yes and no. I was talking about:
      while (<FH>) { ... }

      VS
      $line = <FH>; # on its own / not as while condition

      Given the OP's prelude, I really thought that the OP was referring to these two cases. Sorry for the confusion! :)

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://853722]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others taking refuge in the Monastery: (7)
As of 2015-07-05 15:10 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (67 votes), past polls