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

If you are not comfortable with map then consider
sub concat { my @s = @_ ; # strings my $max = $#s ; # last index # add extra tab to short strings except last one for my $n (0..$max-1){ $s[$n] .= "\t" if (length($s[$n]) < 8); } return join "\t",@s; # sub returns last expression # evaluated so this works too # join "\t",@s; }
poj
  • Comment on Re: Concatenating strings with tabs between and returning the result
  • Download Code

Replies are listed 'Best First'.
Re^2: Concatenating strings with tabs between and returning the result
by Aristotle (Chancellor) on Jan 18, 2003 at 23:42 UTC
    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.

      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.