如前所述,这是一个precedence 问题,因为重复运算符x 的优先级高于串联运算符.。然而,这并不是这里发生的全部,而且问题本身来自一个糟糕的解决方案。
首先,当你说
print (($foo . "\n") x $count);
您正在做的是将重复运算符的上下文更改为列表上下文。
(LIST) x $count
上面的语句真的是这个意思(如果$count == 3):
print ( $foo . "\n", $foo . "\n", $foo . "\n" ); # list with 3 elements
来自perldoc perlop:
二进制“x”是重复运算符。在标量上下文中,或者如果左操作数没有括在括号中,则返回一个字符串,该字符串由左操作数重复右操作数指定的次数组成。在列表上下文中,如果左操作数被括号括起来或者是一个由qw/STRING/组成的列表,它会重复该列表。如果右操作数为零或负数,则根据上下文返回空字符串或空列表。
该解决方案按预期工作,因为print 采用列表参数。但是,如果您有其他需要标量参数的东西,例如子例程:
foo(("text" . "\n") x 3);
sub foo {
# @_ is now the list ("text\n", "text\n", "text\n");
my ($string) = @_; # error enters here
# $string is now "text\n"
}
这是一个细微的差别,可能并不总能得到预期的结果。
对于这种特殊情况,更好的解决方案是根本不使用连接运算符,因为它是多余的:
print "$foo\n" x $count;
甚至使用更普通的方法:
for (0 .. $count) {
print "$foo\n";
}
或者
use feature 'say'
...
say $foo for 0 .. $count;