in reply to Re: Concatenating strings with tabs between and returning the result
in thread Concatenating strings with tabs between and returning the result

Don't use for(;;), it's a source of fencepost (or off-by-one) errors when you don't get your condition right. It's also the least efficient form of loop in Perl. Perl understands lists natively, so you should only rarely need counter variables to index an array.
sub concat { my @s = @_; for (@s) { $_ .= "\t" if 8 > length; } return join "\t", @s; }
Update: switched order on comparison operands.

Makeshifts last the longest.

  • Comment on Re^2: Concatenating strings with tabs between and returning the result
  • Download Code

Replies are listed 'Best First'.
Re: Re^2: Concatenating strings with tabs between and returning the result
by poj (Abbot) on Jan 19, 2003 at 12:11 UTC
    I got these errors
    Warning: Use of "length" without parens is ambiguous Unterminated <> operator
    fixed it with
    $_ .= "\t" if length() < 8;
    poj
      Thanks, I always get bitten by that one. In this case you can also just switch the order of operands to disambiguate the meaning:
      $_ .= "\t" if 8 > length;

      Makeshifts last the longest.

      Gentlemen, Many thanks for all the contributions. In the end, I decided to go for the following code, similar to suggestions made by poj and Aristotle:
      sub concat { my @stringarray = @_; foreach $_ (@stringarray) { $_= "TOOLONG" if length () > 15; $_ .= "\t" if length () < 8; } return (join "\t", @stringarray); }
      I’m particularly pleased with the solution as it enables me to pass a varied number of arguments to the subroutine. The use of the parentheses after the length function is to prevent errors from the compiler when using strict. The function is called as follows:
      $concatstring = &concat ($handle, $hostname, $maintenance, $location, +$buiscat);
      I decided against the use of map, as with the documentation available I can only understand it in a very simple context. Once again, thanks.