为什么跟随perl脚本打印$ a = 3和$ b = 5的所有行(1到14)。 如果我将“if(my $ num = $ a .. $ b)”改为“if(my $ num = 3 .. 5)”,它会给我(按预期)
1 3
2 4
3E0 5
#!/usr/bin/perl
$a=3;
$b=5;
while (<DATA>) {
if (my $num = $a .. $b ) {
print $num,"\t", $_;
}
}
__DATA__
1
2
3
4
5
6
7
8
9
10
11
12
13
14
答案 0 :(得分:6)
当触发器操作符被赋予常量操作数时,它隐含地意味着将它们与$.
(当前行号)进行比较,因此3..5
实际上是(($.==3) .. ($.==5))
。如果使用变量,则需要明确进行比较。
所以:
#!/usr/bin/perl
use strict;
use warnings;
my $first_line = 3;
my $last_line = 5;
while (<DATA>) {
if (my $num = ($first_line==$.) .. ($last_line==$.) ) {
print $num,"\t", $_;
}
}
这不是一个错误。这是故意的,它允许你将它缩写为3..5。它不能采取其他的东西,并假设它们是行号,因为你可以使用任意布尔表达式(例如3 ../ last /匹配从第3行到包含“last”的行)。
http://perldoc.perl.org/perlop.html#Range-Operators:
在标量上下文中,“..”返回一个布尔值。运算符是双稳态的,就像一个触发器,并模拟sed,awk和各种编辑器的行范围(逗号)运算符。每个“..”运算符都保持自己的布尔状态,甚至在调用包含它的子例程时也是如此。只要其左操作数为假,它就是假的。一旦左操作数为真,范围运算符将保持为真,直到右操作数为真,此后范围运算符再次变为假。 ... 如果标量“..”的任一操作数是常量表达式,如果该操作数与当前输入行号($。变量)相等(==),则该操作数被视为true。