Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw

split at '- - -'

by Saved (Beadle)
on May 17, 2013 at 13:24 UTC ( #1033972=perlquestion: print w/replies, xml ) Need Help??
Saved has asked for the wisdom of the Perl Monks concerning the following question:

A log file has records separated by a lines with only 3 minus signs. I wish to split on them, but it is not working. I have tried many combinations of \--- \-\-\- with single & double quotes or none. My preference it to enter the Record separator as a command line parameter, but I could hard-code it if need be. Any help in this matter would be much appreciated. Thanx.

Replies are listed 'Best First'.
Re: split at '- - -'
by blue_cowdawg (Monsignor) on May 17, 2013 at 13:39 UTC

    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

      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

      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
      Thanx, looking good...

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://1033972]
Approved by Athanasius
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others scrutinizing the Monastery: (8)
As of 2018-04-20 15:25 GMT
Find Nodes?
    Voting Booth?