[Edinburgh-pm] perl autosplit

Aaron Crane perl at aaroncrane.co.uk
Fri Jun 1 11:37:26 PDT 2007

asmith9983 at gmail.com writes:
> I was trying to use autosplit to extract fields from a file with the
> fields separated by "|" and suspect I may have found a bug
>   perl  -a -F '|' -ne '{print $F[0];};'
> which replied
>   Can't open perl script "|": No such file or directory

That's saying that where Perl expected your command line to have the name
of a file containing your program, it instead found '|'.  So why did Perl
want your command line to mention the script at that point?

The documentation for -F is in 'perldoc perlrun'; that says:

       specifies the pattern to split on if -a is also in effect

That's subtly but distinctly different from the documentation for, say, -e:

  -e commandline
       may be used to enter one line of program

That is, -F insists the autosplit pattern be part of the same command-line
element as the -F itself (unlike -e, where you can optionally put it in a
separate element).  So, if your separator were a colon, you could say

  perl -F: -ane 'print "$F[0]\n"'

However, that's not quite good enough when the separator is a vertical-bar,
because the autosplit pattern is a pattern (regex), not a literal string, so
you need to first backslash any regex metacharacters, and then protect the
result from interpretation by the shell:

  perl -F'\|' -ane 'print "$F[0]\n"'

You can simplify that a little further:

  perl -F'\|' -lane 'print $F[0]'

> awk and cut did the job without needing me to make much effort and less
> typing :-
>   awk -F'|' '{print $1};'
>   cut -d'|' -f 1

It's certainly reasonable to pick the best tool for each job, rather than
forcing everything to be the nail to Perl's hammer.  And, yes, in this
case either of those produces a shorter command.  But you may find in the
future that, as you learn more Perl, it becomes more natural to write such
text-manipulation pipelines with Perl.  For tasks like this, I personally
find Perl easier for all but the simplest tasks.  I suspect I'd use cut in
this case, but something only a little more awkward might well see me
reaching for Perl.  But then, I probably have more experience with Perl
than with anything else.

Aaron Crane

More information about the Edinburgh-pm mailing list