![]() |
|
|
|||||||
![]() |
PERL - Newbie question - trying to get a handle on until text / line skipping |
|
|
Thread Tools | Search this Thread |
|
|
#1 |
|
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 |
|
|
|
|
#2 |
|
Posts: n/a
|
"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. |
|
|
|
#3 |
|
Posts: n/a
|
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. |
|
|
|
#4 |
|
Posts: n/a
|
"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. |
|