正如已经提到的,这是一个优先级问题,因为重复运算符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;