in reply to extracting columns

<$in>; ### Remove header line while (<$in>) { chomp; my ($name, $size) = (split /\t/)[1,3]; print $out "$name\t$size\n"; }

Replies are listed 'Best First'.
Re^2: extracting columns
by GrandFather (Saint) on Mar 22, 2012 at 21:55 UTC

    or without the need for the intermediate variables:

    <$in>; while (<$in>) { chomp; print $out join ("\t", (split /\t/)[1,3]), "\n"; }
    True laziness is hard work
Re^2: extracting columns
by polettix (Vicar) on Mar 22, 2012 at 23:10 UTC
    When there are few fields, I usually prefer to avoid slicing and be more direct:
    my (undef, $name, undef, $size) = split /\t/;
    or even the full stuff
    my ($id, $name, $effects, $size) = split /\t/;
    I find it a bit more readable but... it's a matter of taste!

    perl -ple'$_=reverse' <<<ti.xittelop@oivalf

    Io ho capito... ma tu che hai detto?
      I find it a bit more readable but... it's a matter of taste!

      Don't declare "my" variables that you do not use.

      Use a regex when you want to "keep" something.
      Use split when you want to "throw away something"

      Use list slice to "throw away" extraneous stuff from a split() or a match "global".

      my ($id, $name, $effects, $size) = split /\t/; #wrong
      Forget even declaring, for example, $effects if it is not used.
      Focus the code on what is used from the input - forget the stuff that is not used.
      Explain what $effects would have meant - but its not important to this code - in some kind of comment section - if that this important to the overall description of the input file.

      The use of "undef" instead of list slice is just fine for a case like this.
      List slice is great when you want #12, #3, #1, #50-67 in that order.