http://www.perlmonks.org?node_id=1014744


in reply to Re: command line perl reading from STDIN
in thread command line perl reading from STDIN

cat input_file.fq | perl -ne '$s=<>;<>;<>;chomp($s);print length($s)."\n";' > output.txt
Ok, but for the above, if we were to step-by-step describe what is going on. How would it be described? It just that from the above I thought it would assign $s on every line OR skip 2 lines and then assign $s to the third line and repeat.

Replies are listed 'Best First'.
Re^3: command line perl reading from STDIN
by choroba (Cardinal) on Jan 22, 2013 at 18:02 UTC
      At the start, its the second line and then every fourth file after. ie line 2, 6, 8, 12 .. eof
      This is what was confusing me but I think I worked it out. See below. Thanks
Re^3: command line perl reading from STDIN
by perlhappy (Novice) on Jan 22, 2013 at 18:12 UTC
    Actually, I think I've just worked it out my head. Took a bit of thinking but this is what i think it is doing
    first line gets sent, but because <> is unassigned (before $s), it skips; then reads the second line and assigns $s to the line and does whatever; then reads third line but because <> is unassigned, it skips; reads fourth line and the same happens; restarts with 5 line but again because <> is unassigned before the $s it skips; reads 6th line and assigns it to $s and does whatever again
    this continues until end of file

    If this is incorrect, let me know. Otherwise I hope this helps anyone else who might look at it. Thanks for your help choroba
       perl -ne ' $s=<>; <>; <>; do_something_with_$s'

      is equivalent to

       perl  -e ' while (<>) { $s=<>; <>; <>; do_something_with_$s} '

      so 4 lines will be read each pass, but only the second line will be used for anything

      Personally, I'd go with something like

       perl -ne 'chomp; print length($_)."\n" if (/^@/);'

      instead.