> I assume that $_ is the last thing gotten by <STDIN>

Yes, but there is a little more to it than that.

Normally while() does NOT set $_.  So this would not work normally:

while ($foo) { print $_ } # $_ is NOT set

At some point it was decided that most people will use a while loop to loop
over the lines of a file, so some magic dust was sprinkled on the while()
loop to set $_, but ONLY if there is only a file handle as the condition.

So while(<HANDLE>) is a special case.

> while (!(<STDIN> =~ /QUIT/))

This won't set $_ because there is more than just the filehandle in the
condition.

You can though set $_ yourself in the condition, like this:

while ($_ = <STDIN> and !/QUIT/) {
  push @stack, $_;
}
print @stack;

Or even this:

push @stack, $_ while ($_ = <STDIN> and !/QUIT/);
print @stack;

> will regexes always default to using $_

Yes.


Rob

-----Original Message-----
From: Dan Anderson [mailto:[EMAIL PROTECTED]
Sent: Thursday, September 25, 2003 8:40 PM
To: Hanson, Rob
Cc: Perl Newbies
Subject: RE: How do I<STDIN> to a stack until a pattern is matched, How
do I


        First, thank you for your help.  Second, please bear with me as I'm
a
perl noob.

        I assume that $_ is the last thing gotten by <STDIN>.  will regexes
always default to using $_?  I think that's right, but when I try:

while (!(<STDIN> =~ /QUIT/))
{ push @stack, $_; }
print @stack;

it doesn't print anything (although it compiles).

So I typed use warnings; at the top and I get a lot of errors about
using an uninitialized variable (@stack).  Now I assume that @stack
comes into scope as local to that while loop, but typing:

my @stack;
our @stack;
local @stack;

Before the loop do nothing.  Am I missing something? 

Thanks again for your help,

-Dan




On Thu, 2003-09-25 at 20:29, Hanson, Rob wrote:
> > How can I do this?
> 
> You can do it like this...
> 
> # tested
> my @stack;
> 
> while (<STDIN>) {
>   last if /QUIT/;
>   push @stack, $_;
> }
> 
> print "@stack";
> 
> 
> Rob
> 
> -----Original Message-----
> From: Dan Anderson [mailto:[EMAIL PROTECTED]
> Sent: Thursday, September 25, 2003 8:23 PM
> To: Perl Newbies
> Subject: How do I<STDIN> to a stack until a pattern is matched, How do I
> 
> 
> Is there an easy way to read <STDIN> into a stack until some pattern is
> matched and then break.  I tried all sorts of (error producing) code,
> but nothing seemed to work.  I ended up with:
> 
> #! /usr/bin/perl
> 
> #can I make this more concise?
> $infinite_loop = 1;
> while ($infinite_loop)
> {
>   $temp = <STDIN>;
>   if ($temp =~ /QUIT/)
>     { 
>       $infinite_loop = 0; 
>       continue;
>     }
>   push @thestack, $temp;
> }
> 
> I've got a funny feeling that perl will let me make the above 15 lines
> of code /much/ more concise.  How can I do this?  
> 
> Is there any way to do something like?
> 
> while (1)
> {
>   push @thestack, <STDIN> unless <STDIN> =~ /QUIT/;
>   last if <STDIN> =~ continue;
> }
> 
> Or perhaps something even more concise (and much more perlish)?
> 
> Thanks,
> 
> Dan
> 
> 

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to