Go Back   Velocity Reviews > Newsgroups > PERL
User Name
Password
Register FAQ Members List Calendar Search Today's Posts Mark Forums Read

Reply

PERL - Newbie question - trying to get a handle on until text / line skipping

 
Thread Tools Search this Thread
Old 07-15-2003, 06:54 PM   #1
Default Newbie question - trying to get a handle on until text / line skipping


Lets say I have a ascii text file named sumfil and its contents are as
follows :

1
2
3
a
b
c

I dont want to act on any line before the line containing "a". The below
doesnt work. I sit at the command line I think in an infinite loop.

#! /opt/perl5/bin/perl
$tfil = "sumfil";
open (IN, "$tfil") or die;
while (defined($line = <IN>)) {
until ($line =~ "3") {
next;
} # end until
chomp $line;
print "$line\n"
} #end while







Chris Vidal
  Reply With Quote
Old 07-16-2003, 01:07 PM   #2
nobull@mail.com
 
Posts: n/a
Default Re: Newbie question - trying to get a handle on until text / line skipping

"Chris Vidal" <> wrote in message news:<bf1f24$>...
> Lets say I have a ascii text file named sumfil and its contents are as
> follows :
>
> 1
> 2
> 3
> a
> b
> c
>
> I dont want to act on any line before the line containing "a". The below
> doesnt work. I sit at the command line I think in an infinite loop.
>
> #! /opt/perl5/bin/perl
> $tfil = "sumfil";
> open (IN, "$tfil") or die;
> while (defined($line = <IN>)) {
> until ($line =~ "3") {
> next;
> } # end until
> chomp $line;
> print "$line\n"
> } #end while


You have misunderstood what until means in Perl.

until (EXPR) {BLOCK}

is a _looping_ construct.

_Each_ time the above is executed it will repeatedly do BLOCK until
EXPR is true. If BLOCK cannot make EXPR become false and does not
break out of the loop by some other means then this is an infinite
loop.

You you evidently believe until is a simple negated condition with
memory. i.e. it does something once each time it is executed until
some condition is true and thereafter never does it again.

In Perl that would be written:

unless ( EXPR .. 1 == 0 ) { BLOCK }

Also you want the 'next' to go to the next line, i.e. the next
iteration of the while loop. But by default it goes to the next
iteration of the inner-most looping construct (the until). You could
get around this by labling your loops (see perldoc -f next).

But, of course, you didn't want the inner loop at all.

This newsgroup does not exist (see FAQ). Please do not start threads
here.
  Reply With Quote
Old 07-18-2003, 12:50 AM   #3
Chris Vidal
 
Posts: n/a
Default Re: Newbie question - trying to get a handle on until text / line skipping

Yes you are right, thats why I posted my question here.

...cant figure it out or find a good example.

I want to skip some lines ...


<> wrote in message
news: om...
> "Chris Vidal" <> wrote in message

news:<bf1f24$>...
> > Lets say I have a ascii text file named sumfil and its contents are as
> > follows :
> >
> > 1
> > 2
> > 3
> > a
> > b
> > c
> >
> > I dont want to act on any line before the line containing "a". The below
> > doesnt work. I sit at the command line I think in an infinite loop.
> >
> > #! /opt/perl5/bin/perl
> > $tfil = "sumfil";
> > open (IN, "$tfil") or die;
> > while (defined($line = <IN>)) {
> > until ($line =~ "3") {
> > next;
> > } # end until
> > chomp $line;
> > print "$line\n"
> > } #end while

>
> You have misunderstood what until means in Perl.
>
> until (EXPR) {BLOCK}
>
> is a _looping_ construct.
>
> _Each_ time the above is executed it will repeatedly do BLOCK until
> EXPR is true. If BLOCK cannot make EXPR become false and does not
> break out of the loop by some other means then this is an infinite
> loop.
>
> You you evidently believe until is a simple negated condition with
> memory. i.e. it does something once each time it is executed until
> some condition is true and thereafter never does it again.
>
> In Perl that would be written:
>
> unless ( EXPR .. 1 == 0 ) { BLOCK }
>
> Also you want the 'next' to go to the next line, i.e. the next
> iteration of the while loop. But by default it goes to the next
> iteration of the inner-most looping construct (the until). You could
> get around this by labling your loops (see perldoc -f next).
>
> But, of course, you didn't want the inner loop at all.
>
> This newsgroup does not exist (see FAQ). Please do not start threads
> here.



  Reply With Quote
Old 07-18-2003, 12:11 PM   #4
nobull@mail.com
 
Posts: n/a
Default Re: Newbie question - trying to get a handle on until text / line skipping

"Chris Vidal" <> rudely spits TOFU in my face:

> Yes you are right,


I said a lot of things. As far as I know all of them were true.
Without context I have no idea which to refer to.

> thats why I posted my question here.


None of the things I said could have accounted for your decision to
post to a non-existant newsgroup.

> ...cant figure it out or find a good example.


I have no idea what you are talking about.

> I want to skip some lines ...


This was clear from your original post. And appart from your
confusion about 'until' and 'unless' you were basically doing it right
(i.e. using 'next') in your OP. Now I've cleared that up your code
would almost work (except it would include in the output the line that
triggered the state change).

The obvious way to avoid that just to spell it out:

use strict;
use warnings;

my $seen_trigger;
while (<>) {
unless ( $seen_trigger ) {
$seen_trigger = /PATTERN/;
next;
}
print;
}

If you still have a problem then I suggest you produce another minimal
but complete script that illustrates your problem (see posting
guidelines in comp.lang.perl.misc) and post it to that newsgroup
because this one does not exist (see FAQ).

If someone tries to help do not insult them by spitting TOFU in their
faces (see guidelines). Doing so will rapidly exhaust your quota of
good-will.
  Reply With Quote
Reply


Thread Tools Search this Thread
Search this Thread:

Advanced Search

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump