【问题标题】:What does dot-equals mean in Perl?Perl 中的点等于是什么意思?
【发布时间】:2013-01-21 17:41:57
【问题描述】:

".=" 在 Perl 中是什么意思(点等于)?下面的示例代码(在 while 子句中):

if( my $file = shift @ARGV ) {
    $parser->parse( Source => {SystemId => $file} );
} else {
    my $input = "";
    while( <STDIN> ) { $input .= $_; }
    $parser->parse( Source => {String => $input} );
}
exit;

感谢您的任何见解。

【问题讨论】:

  • 我很惊讶Perlop 真的没有解释这个运算符。 编辑:哇 - 事实证明确实如此 - 只是以一种非常迂回的方式。如果您对 '.=' 进行查找,则不会出现任何有用的信息。

标签: perl


【解决方案1】:

句点. 是concatenation operator。右边的等号表示这是一个assignment operator,就像在 C 中一样。

例如:

$input .= $_;

和

一样
$input = $input . $_;

然而,这也有一些 perl 魔法,例如,这消除了初始化变量以避免“未初始化”警告的需要。试试区别:

perl -we 'my $x; $x = $x + 1'   # Use of uninitialized value in addition ...
perl -we 'my $x; $x += 1'       # no warning

这意味着您的代码中的行:

my $input = "";

相当多余。虽然有些人可能会觉得很舒服。

【讨论】:

    【解决方案2】:

    对于几乎任何二元运算符X,$a X= $b 等价于$a = $a X $b。点. 是字符串连接运算符;因此,$a .= $b 表示“将$b 粘贴在$a 的末尾”。

    在您的代码中,您从一个空的$input 开始,然后重复读取一行并将其附加到$input 直到没有剩余的行。您应该以$input 的内容结束整个文件,一次一行。

    应该相当于无环

    local $/;
    $input = <STDIN>;
    

    (将行分隔符定义为未定义的字符,然后读到永远不会出现的“行尾”)。

    编辑:根据 TLP 的评论更改。

    【讨论】:

    • 只有在范围内时才本地化。实际上,-0777 是特殊情况,将$/ 设置为 undef
    • @Amadan 你让我有一段时间不确定,但不,它设置为一个数值 511,它被视为一个字符串。试试看。
    • @TLP:嗯,看那个。 :) 直到
    • @TLP:这不是事实。那个山羊接线员怎么样,嗯?
    • @Amadan 我个人最喜欢的是 Eskimo Kiss 接线员。
    【解决方案3】:

    你找到了字符串连接操作符。

    让我们试试吧:

    my $string = "foo";
    
    $string .= "bar";
    
    print $string;
    foobar
    

    【讨论】:

      【解决方案4】:

      这将连接到 $input var。通过 STDIN 输入的任何内容都将分配给 $input。

      【讨论】:

        猜你喜欢
        • 2018-03-05
        • 2010-12-28
        • 2023-03-25
        • 2020-05-21
        • 1970-01-01
        • 2011-03-06
        • 1970-01-01
        • 1970-01-01
        • 2015-06-09
        相关资源
        最近更新 更多