Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change

Re: split at '- - -'

by blue_cowdawg (Monsignor)
on May 17, 2013 at 13:39 UTC ( #1033974=note: print w/replies, xml ) Need Help??

in reply to split at '- - -'

Since I wasn't 100% sure of what you were asking for, I give you two! two solutions in one!

#!/usr/bin/perl -w use strict; use Data::Dumper; my $line="this---is---Sparta!"; # # Case 1 a line with *fields* seperated by dashes my @f=split('---',$line); #split the line along the dashes print Dumper(\@f); # Case 2 Records seperated by three dashes my $oldIFS=$/; #save the old IFS $/ = undef; # make it undefined $line=<DATA>; # slurp in file $/=$oldIFS; # restore IFS @f = split('---',$line); # split on dashes $_ =~ s/^\n// foreach @f; # remove leading EOL chomp (@f); # remove traiing EOL print Dumper(\@f); exit(0); # we're done, going home __END__ line1 --- line2 --- line3
when run gives you:
$VAR1 = [ 'this', 'is', 'Sparta!' ]; $VAR1 = [ 'line1', 'line2', 'line3' ];

Peter L. Berghold -- Unix Professional
Peter -at- Berghold -dot- Net; AOL IM redcowdawg Yahoo IM: blue_cowdawg

Replies are listed 'Best First'.
Re^2: split at '- - -'
by tobyink (Abbot) on May 17, 2013 at 13:54 UTC

    undef isn't the only useful thing you can assign to $/...

    use strict; use Data::Dumper; my @f; { local $/ = "\n---\n"; chomp(@f = <DATA>); } print Dumper(\@f); exit; __END__ line1 --- line2 --- line3 ---
    package Cow { use Moo; has name => (is => 'lazy', default => sub { 'Mooington' }) } say Cow->new->name
Re^2: split at '- - -'
by hdb (Prior) on May 17, 2013 at 14:00 UTC

    As a small variant, there could also be a hybrid case where you want to split on "---" if they are on a line by themselves but not if they occur within a line. Adapting Peter's code:

    #!/usr/bin/perl -w use strict; use Data::Dumper; my $line; { local $/ = undef; $line=<DATA>; } chomp $line; my @f = split('\n---\n',$line); print Dumper(\@f); __END__ line1 --- line2---line2a --- line3
Re^2: split at '- - -'
by Saved (Beadle) on May 17, 2013 at 14:05 UTC
    Thanx, looking good...

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1033974]
[Corion]: hippo: If you have a Unicode-wise Perl then likely some zero-width characters in $x would work. Maybe $x = "\x{200b}" works.
[Corion]: Hmm - no, that outputs 1 for me on 5.14 - perl -wle "my $x = qq(\x{200b}); warn $x; warn length $x"
[hippo]: Smart - I'll give that a go. Thanks.
[hippo]: Ah
[Corion]: But maybe there is some other Unicode string that will be true but have a zero width
[hippo]: For explanation, I've seen this construct in someone else's code (no names, no pack drill) and couldn't think of a situation to trigger it.
[Corion]: You'll have to look somewhere esoteric for that. Maybe some tied variable or special dualvar can also trigger that. But it's certainly not a common occurrence
[Corion]: And on 5.20, the following also outputs no find:perl -wle 'for my $x ("\x{2000}".."\ x{1fffff}") { if( $x && ! length $x ) { warn qq(<$x>); warn length $x; die } }'
[Corion]: (this time on Unix)
[hippo]: Understood. I'll have to go through the code and see if it's doing anything fancy with ties, dual-vars or non-scalars. In the end, it's probably a bug though.

How do I use this? | Other CB clients
Other Users?
Others meditating upon the Monastery: (11)
As of 2017-07-27 13:32 GMT
Find Nodes?
    Voting Booth?
    I came, I saw, I ...

    Results (413 votes). Check out past polls.