Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change

Re: "defined" in while loop Edit | Delete | Quote | Reply | Private Reply

by ELISHEVA (Prior)
on Feb 16, 2009 at 23:25 UTC ( #744237=note: print w/replies, xml ) Need Help??

in reply to "defined" in while loop Edit | Delete | Quote | Reply | Private Reply

OP writes:

1) while(<stdin>){print " I saw $_" ;} # Is thie (sic) equivalent to 2) while($_=<stdin>){ print "I saw $_" ;} so how will while loop end because undefined value in the $_ will not let the loop end

In Perl, the assignment $_ = <> doesn't necessarily make $_ "defined"? Strange isn't it? But here is how it happens:
my $x = undef; #clears out $x and makes it undefined my $y = $x; #since $x is undefined, so is $y

It might be easier to think of "undefined" in Perl as "null" rather than "not yet assigned".

Also, it isn't necessary for $_ to be undefined (or unassigned) for the loop to end. A while loop ends when expr in while (expr) evaluates to false. Being undefined is only one way of being false. Other ways of being false are:

  • being equal to 0
  • being equal to the empty string, ''

Best, beth

Replies are listed 'Best First'.
Re^2: "defined" in while loop Edit | Delete | Quote | Reply | Private Reply
by ikegami (Pope) on Feb 16, 2009 at 23:47 UTC

    Also, it isn't necessary for $_ to be undefined (or unassigned) for the loop to end.

    While that's true in general,

    >perl -le"$_=4; while (--$_) { print }" 3 2 1

    It's not true in this case.

    >perl -e"print 0" | perl -le"while ($_ = <>) { print $_ ? 'true' : 'fa +lse' }" false >perl -MO=Deparse -e"while (<>) {}" while (defined($_ = <ARGV>)) { (); } -e syntax OK >perl -MO=Deparse -e"while ($_ = <>) {}" while (defined($_ = <ARGV>)) { (); } -e syntax OK >perl -MO=Deparse -e"while (defined($_ = <>)) {}" while (defined($_ = <ARGV>)) { (); } -e syntax OK
      Thanks! Learn something every day! (well, lots today). But what is going on here? What (under the covers) makes this a special case? Why is Perl wrapping $_=<> in defined($_ =<>)? Another convenience feature? And where else does this happen?

      Here's my output with a slightly expanded print line checking both the value and the defined status and just to make sure there was no monkey business with the special variable $_ I changed it to $line - same result as you, of course. (I had to switch " and ' to keep the bash shell from trying to resolve $_):

      $ perl -e'print 0' | perl -e'while ($line = <>) { print "\$line=<$lin +e> \$line=<" . ($line ? "true" : "false") . "> defined=<" . (defined( +$line) ? "true" : "false") . ">\n"};' $line=<0> $line=<false> defined=<true>

      It is also not anything special about the syntax $somevar = <> because I get the same result if I use readline(...):

      $ perl -e'print 0' | perl -e'while ($line = readline(*STDIN)) { print +"\$line=<$line> \$line=<" . ($line ? "true" : "false") . "> defined=< +" . (defined($line) ? "true" : "false") . ">\n"};' $line=<0> $line=<false> defined=<true>

      Or is it? Could it be that both while($somevar = readline(...)) and while($somevar = <...>), but only these, have special semantics? I noticed that if I wrap readline in a function of my own that the special behavior goes away. For example,

      use strict; use warnings; #The following all output: # BEFORE # $line=<0> $line=<false> defined=<true> # AFTER # # while (my $line = readline(*STDIN)) { # while (my $line = <STDIN>) { # while (my $line = <>) { # # but wrapping readline in a sub produces only # BEFORE # AFTER print "BEFORE\n"; while (my $line = wrapped_readline(\*STDIN)) { print "\$line=<$line> \$line=<" . ($line ? "true" : "false") . "> defined=<" . (defined($line) ? "true" : "false") . ">\n"; } print "AFTER\n"; sub wrapped_readline { my $fh = shift @_; my $sLine = readline($$fh); #print "wrapped_readline: <$sLine>\n"; return $sLine; }

      Thanks in advance, beth

      Update: refined question a bit; fixed error in sub of $_ with $line; added examples using readline and a sub wrapping readline.

        Another convenience feature?

        Yes. It rarely matters, since most uses of <>/readline are for reading newline-terminated lines, which are necessarily true.

        And where else does this happen?

        It depends on your perception of "this". Perl does many things implicitly, but none other exactly like this.

        It is also not anything special about the syntax $somevar = <> because I get the same result if I use readline(...)

        It's not specific to the symtax, it's specific to the operator. <> (when used to read from a file) and readline are the same operator.

        >perl -MO=Concise -e"my $fh; readline($fh)" ... 6 <1> readline[t2] vK/1 ->7 5 <0> padsv[$fh:1,2] ->6 -e syntax OK >perl -MO=Concise -e"my $fh; <$fh>" ... 6 <1> readline[t2] vK*/1 ->7 5 <0> padsv[$fh:1,2] s ->6 -e syntax OK

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://744237]
[stevieb]: well, what happens is the Arduino 'listens' for requests r/w, and does the appropriate thing when it's interrupted based on the 'register' address sent in. It's ugly as it was my first attempt, but I've got great new ideas I'm just sitting.
[stevieb]: ...down to implement now. Here's the sketch as it currently sits
[shmem]: well I use I2C and SPI and stuff, but creating a pseudo chip looks to me like lot of indirection and memory clutter... not?
[choroba]: Are you going to use the device soon? Related to your comment about "not having much time to do a lot of coding"...
[stevieb]: sure, but I'm just learning ;) I consider it practice to get a good understanding of what goes on *after* an I2C/SPI request is made
[shmem]: ah ok. Gonna read that. but now....
shmem compiles himself into his template
[stevieb]: this is my RPi:: distribution overall automation build system physical layout. It doesn't encompass all of my RPi dists yet, ...
[stevieb]: ...but I'm getting close. I've been soldering my own PCBs to gain that experience as well, before I have my own manufactured.
[stevieb]: heh, nice *template* ;) 'night shmem!

How do I use this? | Other CB clients
Other Users?
Others browsing the Monastery: (6)
As of 2017-06-25 22:48 GMT
Find Nodes?
    Voting Booth?
    How many monitors do you use while coding?

    Results (572 votes). Check out past polls.