in reply to Extracting selected fields form file record

ehm ...

> > spaces before and after

the spaces before are IMHO best dealt by stripping them before splitting.

$line =~ s/^\s+//;

Even your pseudo python code can't do this in a one-liner with split (IMHO).

But more importantly your definition of "field" is fuzzy now.

Please clarify


provided there are no "empty fields" and "multiple whitespaces" are allowed as separators:

You can use a regex like /(\S+)/g ( \S is non-whitespace, the opposite of \s)

Debugger demo:

DB<35> $line = " a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 \n" DB<36> x ($line =~ /(\S+)/g)[0,1,3,5,7,9] 0 'a0' 1 'a1' 2 'a3' 3 'a5' 4 'a7' 5 'a9' DB<37>

Cheers Rolf
(addicted to the Perl Programming Language :)
Wikisyntax for the Monastery


) or by using the magic of ' ' soonix showed us here.

Replies are listed 'Best First'.
Re^2: Extracting selected fields form file record (updated)
by rsFalse (Chaplain) on Feb 07, 2022 at 12:27 UTC
    We can omit parentheses, i.e. capture group number 1 isn't necessary.
    my( $first, $second, $third, $fourth, $fifth, $sixth ) = ( $line =~ m/ +\S+/g )[ 0, grep { $_ % 2 == 1 } 1 .. 9 ];
Re^2: Extracting selected fields form file record (updated)
by Anonymous Monk on Feb 07, 2022 at 12:32 UTC
    Thanks everyone. Using ' ' is working as I need on records from an ASCII file.
    And I'm going to load the records with File::Slurp, so I don't care of chomp:
    use File::Slurp qw(read_file); my @lines = read_file('/path/file',chomp=>1);
        If you must use a module for this, may I suggest Path::Tiny or File::Slurper?

        While those modules are nice, I personally find it a bit difficult to keep track of all of the different modules' opinions on how to best slurp files. And considering that slurping a file takes at most two lines of pure Perl code and I remain in full control over layers etc., I no longer see the need to load a module just for that. The following only requires knowing some of the details of layers, such as knowing the effect of ${^OPEN}, using :encoding(UTF-8) instead of :utf8, and that UTF-16 files on Windows require the layers :raw:encoding(UTF-16):crlf (the latter two being documented in PerlIO and "open" Best Practices).

        my $all = do { open my $fh, '<', $filename or die "$filename: $!"; local $/; <$fh> }; my @lines = do { open my $fh, '<', $filename or die "$filename: $!"; <$fh> }; chomp @lines;