summaryrefslogtreecommitdiff
path: root/pod/perlfunc.pod
diff options
context:
space:
mode:
authorbrian d foy <bdfoy@cpan.org>2009-09-25 15:15:59 -0500
committerbrian d foy <bdfoy@cpan.org>2009-09-25 15:16:17 -0500
commit0f03d336cfac20781d0a45d83906fa559a5ecf17 (patch)
tree604160723fcdde9e731444fbcf79aa7db46fdd53 /pod/perlfunc.pod
parent57ad57e0c240e6f9b1b9e73de8068a9bc11b5466 (diff)
downloadperl-0f03d336cfac20781d0a45d83906fa559a5ecf17.tar.gz
RT #69208: Check eof before using readline in perlfunc readline example
Diffstat (limited to 'pod/perlfunc.pod')
-rw-r--r--pod/perlfunc.pod38
1 files changed, 24 insertions, 14 deletions
diff --git a/pod/perlfunc.pod b/pod/perlfunc.pod
index 08c406c0cd..2ef331aa7c 100644
--- a/pod/perlfunc.pod
+++ b/pod/perlfunc.pod
@@ -4332,12 +4332,12 @@ X<readline> X<gets> X<fgets>
Reads from the filehandle whose typeglob is contained in EXPR (or from
*ARGV if EXPR is not provided). In scalar context, each call reads and
returns the next line, until end-of-file is reached, whereupon the
-subsequent call returns undef. In list context, reads until end-of-file
+subsequent call returns C<undef>. In list context, reads until end-of-file
is reached and returns a list of lines. Note that the notion of "line"
used here is however you may have defined it with C<$/> or
C<$INPUT_RECORD_SEPARATOR>). See L<perlvar/"$/">.
-When C<$/> is set to C<undef>, when readline() is in scalar
+When C<$/> is set to C<undef>, when C<readline> is in scalar
context (i.e. file slurp mode), and when an empty file is read, it
returns C<''> the first time, followed by C<undef> subsequently.
@@ -4348,21 +4348,31 @@ operator is discussed in more detail in L<perlop/"I/O Operators">.
$line = <STDIN>;
$line = readline(*STDIN); # same thing
-If readline encounters an operating system error, C<$!> will be set with the
-corresponding error message. It can be helpful to check C<$!> when you are
-reading from filehandles you don't trust, such as a tty or a socket. The
-following example uses the operator form of C<readline>, and takes the necessary
-steps to ensure that C<readline> was successful.
+If C<readline> encounters an operating system error, C<$!> will be set
+with the corresponding error message. It can be helpful to check
+C<$!> when you are reading from filehandles you don't trust, such as a
+tty or a socket. The following example uses the operator form of
+C<readline> and dies if the result is not defined.
- for (;;) {
- undef $!;
- unless (defined( $line = <> )) {
- last if eof;
- die $! if $!;
+ while ( ! eof($fh) ) {
+ defined( $_ = <$fh> ) or die "readline failed: $!";
+ ...
+ }
+
+Note that you have can't handle C<readline> errors that way with the
+C<ARGV> filehandle. In that case, you have to open each element of
+C<@ARGV> yourself since C<eof> handles C<ARGV> differently.
+
+ foreach my $arg (@ARGV) {
+ open(my $fh, $arg) or warn "Can't open $arg: $!";
+
+ while ( ! eof($fh) ) {
+ defined( $_ = <$fh> )
+ or die "readline failed for $arg: $!";
+ ...
}
- # ...
}
-
+
=item readlink EXPR
X<readlink>