29

..任何人都可以用一些例子来说明和运算符之间的确切区别...吗?

perlop手册页:

如果您不希望它在下一次评估之前测试正确的操作数,如在 sed 中,只需使用三个点(“...”)而不是两个点。

但这究竟意味着什么?我不明白 perlop 的例子:

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

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

4

4 回答 4

17

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

与 « ..»,

  1. " - Foo"
    1. /0/返回假。
    2. ..返回假。
  2. "01 - Bar"
    1. /0/返回真。翻动!
    2. /1/返回真。翻牌!
    3. ..返回真(因为第一次检查为真)。
  3. "1 - Baz"
    1. /0/返回假。
    2. ..返回假。
  4. " - Quux"
    1. /0/返回假。
    2. ..返回假。

与 « ...»,

  1. " - Foo"
    1. /0/返回假。
    2. ...返回假。
  2. "01 - Bar"
    1. /0/返回真。翻动!
    2. ...返回真。
  3. "1 - Baz"
    1. /1/返回真。翻牌!
    2. ...返回真。
  4. " - Quux"
    1. /0/返回假。
    2. ...返回假。
于 2012-06-13T19:08:50.653 回答
4

如果您有类似/start/ .. /end/输入的情况

start some text end
start
some other text
end

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

于 2012-06-13T19:11:27.753 回答
4

在这里重复这个例子:

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

这很棘手......当您使用 2 个点时发生的情况..是,当您达到 时"01 - Bar",两个条件都经过测试并且都成功(因为该行有 a0和 a 1)。因此,您的打印已打开并立即关闭。

但是,当您使用 时...,第一个条件成功,但直到循环的下一次迭代才尝试第二个条件,因此"01 - Bar"将其"1 - Baz"打开并关闭。因此,您会看到打印的两行。

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

于 2012-06-13T19:14:16.967 回答
3

文章

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

总结一下:

一个点

  • 连接运算符

    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/;
    }
    

三个点

  • 雅达-雅达声明

    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
    }
    

其他答案更详细地介绍了两个触发器运算符之间的区别。

于 2014-04-09T17:05:36.433 回答