Perl三点运算符......例子

时间:2012-06-13 18:54:44

标签: perl

有人可以通过一些示例展示.....运营商之间的确切差异吗?

来自perlop手册页:

  

如果你不想让它在下一次测试右边的操作数   评估,如在sed中,只使用三个点(“...”)而不是两个。

但究竟是什么意思呢?我不明白perlop的例子:

@lines = ("   - Foo",
          "01 - Bar",
          "1  - Baz",
          "   - Quux"
);
foreach (@lines) {
    if (/0/ .. /1/) {
        print "$_\n";
    }
}

...会打印Baz - 但为什么?更准确地说,为什么Baz不打印两个点,而只打印...

4 个答案:

答案 0 :(得分:15)

«...»在真正的翻转检查后不会立即进行翻牌检查。

使用«..»,

  1. " - Foo"
    1. /0/返回false。
    2. ..返回false。
  2. "01 - Bar"
    1. /0/返回true。翻转!
    2. /1/返回true。翻牌!的
    3. ..返回true(因为第一次检查是真的)。​​
  3. "1 - Baz"
    1. /0/返回false。
    2. ..返回false。
  4. " - Quux"
    1. /0/返回false。
    2. ..返回false。
  5. 使用«...»,

    1. " - Foo"
      1. /0/返回false。
      2. ...返回false。
    2. "01 - Bar"
      1. /0/返回true。翻转!
      2. ...返回true。
    3. "1 - Baz"
      1. /1/返回true。翻牌!
      2. ...返回true。
    4. " - Quux"
      1. /0/返回false。
      2. ...返回false。

答案 1 :(得分:4)

如果您有/start/ .. /end/的案例,请输入

start some text end
start
some other text
end

..运算符会在读取后立即处理第一行中的end,并且只会打印some text...运算符不会处理第一行的end,因此也会打印其他文本。基本上,如果结束值与开头在同一行上匹配,则可以避免停止范围。 ...将检查推迟到下一次迭代。

答案 2 :(得分:4)

在此重复示例:

@lines = ("   - Foo",
          "01 - Bar",
          "1  - Baz",
          "   - Quux"
);
foreach (@lines) {
    if (/0/ .. /1/) {
        print "$_\n";
    }
}

这很棘手......当你使用2个点..时发生的事情是当你到达"01 - Bar"时,两个条件都会被测试并且都成功(因为那个line有一个0和一个1)。因此,您的打印已打开并立即关闭。

但是,当您使用...时,第一个条件成功,但第二个条件在循环的下一次迭代之前不会尝试,因此"01 - Bar"将其打开并且"1 - Baz"转它关了。因此,您会看到两条线都打印出来。

棘手的部分是要意识到"01 - Bar"满足两种测试。

答案 3 :(得分:2)

文章

有一篇很棒的文章叫Dots and Perl,我建议你阅读它。

总结:

One Dot

  • 连接运算符

    say "one" . "two";
    # Outputs "onetwo"
    

两个点

  • 范围运算符

    my @numbers = (1..100); # has one hundred numbers from 1 to 100
    
  • 触发器操作员

    while (my $line = readline($fh)) {
        process_this_line($line) if m/START/ .. m/END/;
    }
    

三个点

  • Yada-yada声明

    sub example {
        ...
        # throws "Unimplemented" exception when called
    }
    
  • 触发器操作符,三点版本

    while (my $line = readline($fh)) {
        process_this_line($line) if m/START/ ... m/END/;
        # The only difference between this and the two-dot version
        # occurs when a single line has both START and END
    }
    

其他答案详细介绍了两个触发器操作符之间的区别。