Perl究竟如何处理操作员链接?

And*_*ndy 4 perl

所以我有一些不起作用的代码:

print $userInput."\n" x $userInput2; #$userInput = string & $userInput2 is a integer
Run Code Online (Sandbox Code Playgroud)

如果数字当然超过0,它会打印出来一次就好了,但是如果数字大于1,它就不会打印出来.我来自java背景,我认为它首先进行连接,然后是结果将是与x运营商相乘的结果.但当然不会发生这种情况.现在它在我执行以下操作时有效:

$userInput .= "\n";
print $userInput x $userInput2;
Run Code Online (Sandbox Code Playgroud)

我是Perl的新手所以我想知道链接到底发生了什么,如果我能做到的话.

Eev*_*vee 8

你问的是运营商优先权.("链接"通常指方法调用的链接,例如$obj->foo->bar->baz.)

Perl文档页面perlop以优先级顺序的所有运算符列表开始. x具有与其他乘法运算符相同的优先级,并且.具有与其他加法运算符相同的优先级,因此当然x首先进行求值.(即,它"具有更高的优先级"或"更紧密地绑定".)

与在Java中一样,您可以使用括号解决此问题:

print(($userInput . "\n") x $userInput2);
Run Code Online (Sandbox Code Playgroud)

请注意,这里需要对括号.如果你只使用内括号,Perl会将它们视为指示参数print,如下所示:

# THIS DOESN'T WORK
print($userInput . "\n") x $userInput2;
Run Code Online (Sandbox Code Playgroud)

这将打印一次字符串,然后重复print多次返回值.在空格之前放置空间(没有帮助,因为空格通常是可选的并且被忽略.在某种程度上,这是运算符优先级的另一种形式:函数调用绑定比其他任何东西都紧密.

如果你真的讨厌有更多括号而不是严格必要,你可以用一元运算+符击败Perl :

print +($userInput . "\n") x $userInput2;
Run Code Online (Sandbox Code Playgroud)

这将它print与the 分开(,因此Perl知道该行的其余部分是单个表达式.一元+没有任何影响; 它的主要用途正是这种情况.

  • 或者`print'$ userInput \n"x $ userInput2` (3认同)