Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?

Re: Problem with split using a | separator

by toolic (Bishop)
on Jan 23, 2009 at 16:53 UTC ( #738525=note: print w/replies, xml ) Need Help??

in reply to Problem with split using a | seperator

A style note: you could use an array slice to save yourself some typing. Instead of:
my $outrecord = join( '|', $fld[0], $fld[3], $fld[4], $fld[5], $fld[6], $fld[7], $fld[8] +);


my $outrecord = join '|', @fld[0, 3..8];

Update: Added link to docs.

Replies are listed 'Best First'.
Re^2: Problem with split using a | separator
by Grey Fox (Chaplain) on Jan 23, 2009 at 18:02 UTC
    Thanks toolic;

    Using the style you suggested made my code simpler in a few of my programs.

    -- Grey Fox
    "We are grey. We stand between the darkness and the light" B5
      if ( $#ARGV < 0 ) { print "Usage: $0 [In File][Out File]\n"; exit(1); } my $emtocin = $ARGV[0]; my $emtocout = $ARGV[1] || 'cmpemtocout.txt';
      Since you open to style suggestions, the above could be written:
      die "Usage: $0 [In File][Out File]\n" if @ARGV <1; my ($emtocin, $emtocout)= @ARGV; $emtocout ||= 'cmpemtocout.txt';
      In Perl you can multiple lvalues! In general using a subscript is not a good idea in Perl. @ARGV is more clear than $#ARGV and you will use the @array syntax LOTS! An "off by one error" is one of the if not, the most common error in programming. A big advantage of Perl is that it greatly reduces this chance. Think in term of number of things in the list, not in terms of last index in list.

      Perl has a ||= operator that is often overlooked because it doesn't exist in most languages. Here an undef evaluates to "false", so this sets $emtocout to the default value if not already defined, which evidently is what you want.

      Also be aware that "die" prints different things depending upon whether you put a "\n" at the end of the string or not. You get executing path and line number if you leave off the "\n". In your opens, would be able to tell which line had the problem.

      You can also apply the list slice operator to the list to begin with instead of waiting until the print (why save something you don't need?).

      my @fld = ( split(/\|/, $record ) )[0, 3..8]; #and print could look like this: print FDOUT join("\n",@fld),"\n"; #you don't need $outrecord
      Not trying to hyper-critical, just helpful. EDIT:
      print FDOUT join("\n",@fld),"\n"; #should have course been, print FDOUT join('|',@fld),"\n";

Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://738525]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others cooling their heels in the Monastery: (5)
As of 2022-10-04 14:17 GMT
Find Nodes?
    Voting Booth?
    My preferred way to holiday/vacation is:

    Results (17 votes). Check out past polls.