关于Perl范围操作符

前端之家收集整理的这篇文章主要介绍了关于Perl范围操作符前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我对Perl中的范围运算符有疑问.代码在这里:
#! /usr/bin/perl
 open FILE,"<test.txt";
 while (<FILE>) {
     print if (1 .. 5);
 }
 close FILE;

test.txt中的内容类似于:

1
 2
 3
 4
 5

代码的结果是文件的所有五行.当我使用print(1 … 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个可以通过.

猜你在找的Perl相关文章