in reply to perl substitution difficulty

I think split and join would make a better approach here:
while (<FILE>) { print join ",", split( " ", $_, 6 ); }
The first arg in the split call is a "magic" space -- which means break on one or more whitespace characters (update: for the split to use a "magic" space, it needs to be quoted, not a regex -- thanks and apologies, guys!). The third arg to split says that only 6 pieces should be returned -- that means upon seeing the sixth non-whitespace string, it will ignore all remaining whitespace characters, and the sixth element will contain everything to the end of the string.

Update: you might need to watch out for lines in the log file that contain commas; in those cases, double-quotes will be needed around each field that contains a comma. (And if any field contains a double-quote, that needs to be escaped by doubling it:

# input: Oct 1 13:23:25 smoothwall-swe3 kernel: Enabling fast FPU save, restor +e and "foo"... done. # should produce as output: Oct,1,13:23:25,smoothwall-swe3,kernel:,"Enabling fast FPU save, restor +e and ""foo""... done."
Not hard to do if you split into an array, then loop over the array elements. But you may want to look at a module for that (e.g. Text::xSV). Or you could just delete commas and quotes from the input before doing the split/join. ;)

Replies are listed 'Best First'.
Re^2: perl substitution difficulty
by Somni (Friar) on Oct 15, 2007 at 12:24 UTC
    It's " " that triggers the magic behavior, as in split(" ", $str). Your code, split(/ /, $str), is just a split on a single space.
Re^2: perl substitution difficulty
by svenXY (Deacon) on Oct 15, 2007 at 12:20 UTC
    Hi,
    I cant't rebuild that magicness on my machine though - it joins on every space and therefore adds to many commas. Sure you dont mean /\s+/?
    svenXY