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

C

Chris Vidal

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
 
N

nobull

Chris Vidal said:
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.
 
C

Chris Vidal

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 ...
 
N

nobull

Chris Vidal said:
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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,015
Latest member
AmbrosePal

Latest Threads

Top