有人可以通过一些示例展示..
和...
运营商之间的确切差异吗?
来自perlop手册页:
如果你不想让它在下一次测试右边的操作数 评估,如在sed中,只使用三个点(“...”)而不是两个。
但究竟是什么意思呢?我不明白perlop的例子:
@lines = (" - Foo",
"01 - Bar",
"1 - Baz",
" - Quux"
);
foreach (@lines) {
if (/0/ .. /1/) {
print "$_\n";
}
}
...
会打印Baz
- 但为什么?更准确地说,为什么Baz
不打印两个点,而只打印...
?
答案 0 :(得分:15)
«...
»在真正的翻转检查后不会立即进行翻牌检查。
使用«..
»,
" - Foo"
/0/
返回false。..
返回false。"01 - Bar"
/0/
返回true。翻转!/1/
返回true。翻牌!的⇐强> ..
返回true(因为第一次检查是真的)。"1 - Baz"
/0/
返回false。..
返回false。" - Quux"
/0/
返回false。..
返回false。使用«...
»,
" - Foo"
/0/
返回false。...
返回false。"01 - Bar"
/0/
返回true。翻转!...
返回true。"1 - Baz"
/1/
返回true。翻牌!...
返回true。" - Quux"
/0/
返回false。...
返回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,我建议你阅读它。
总结:
连接运算符:
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
}
其他答案详细介绍了两个触发器操作符之间的区别。