我对Perl中的范围运算符有疑问.代码在这里:
#! /usr/bin/perl open FILE,"<test.txt"; while (<FILE>) { print if (1 .. 5); } close FILE;
test.txt中的内容类似于:
1 2 3 4 5
解决方法
文件的内容实际上并不重要.然而,重要的是行号(每条处理行的行号),因为它是针对..运算符的每个操作数进行检查的.它实际上可以写成……
print if ($. == 1) .. ($. == 5);
根据触发规则,当行号变为等于1时,打印将开始工作,当行号变为等于5时,打印将结束.触发器中…和…之间的唯一区别是关于测试两个操作数在同一表达式上,这与本案例无关.
你可能想要使用的是……
print if $_ ~~ [1..5];
…也就是说,在一个范围内测试该行的内容.但是在列表上下文中……和…之间没有区别 – 它们都返回相同的范围:
print for (1..5); # 12345 print for (1...5); # 12345 as well
现在有些东西……好吧,不是那么完全不同. )考虑following:
while (<DATA>) { print '..',$_ if 1..($. >= 1); print '...',$_ if 1...($. >= 1); } __DATA__ 1 2 3
它打印…
..1 ...1 ...2
……然后什么都没有,因为……
> ..运算符检查同一 – 第一行的两个条件.检查第一个条件($.== 1)将其打开(并使整个..表达式的结果等于1).但猜猜怎么了?它会立即关闭,就像$. > = 1也评估为1(真).当触发器关闭时,所有下一行必须再次通过第一个条件,这是不可能发生的.> ……运算符更放松.对于第一行,由于第一个条件是真实的,网关是打开的 – 但是这里没有检查第二个表达式!但是,对于第二行,关闭网关将进行检查 – 但是有2个可以通过.