阅读这个Perl: extract rows from 1 to n (Windows)我不理解触发器操作符/读取线计数器部分。
perl -nE 'say $c if $c=1..3' my_file
1
2
3E0
有人可以更详细地解释一下这个输出的来源吗?
阅读这个Perl: extract rows from 1 to n (Windows)我不理解触发器操作符/读取线计数器部分。
perl -nE 'say $c if $c=1..3' my_file
1
2
3E0
有人可以更详细地解释一下这个输出的来源吗?
引用perlop:
在标量上下文中,“
..
”返回一个布尔值。该运算符是双稳态的,就像一个触发器,并模拟sed、awk和各种编辑器的行范围(逗号)运算符。每个 "..
" 运算符都维护自己的布尔状态,即使在调用包含它的子例程时也是如此。只要它的左操作数是假的,它就是假的。一旦左操作数为真,范围运算符保持真,直到右操作数为真,之后范围运算符再次变为假。直到下一次评估范围运算符时它才会变为假。它可以测试正确的操作数并在它变为真的相同评估中变为假(如在 awk),但它仍然返回一次。如果您不希望它在下一次评估之前测试正确的操作数,如sed,只需使用三个点(“...
”)而不是两个点。在所有其他方面,“...
”的行为就像“..
”一样。当运算符处于“假”状态时不计算右操作数,而当运算符处于“真”状态时不计算左操作数。优先级略低于
||
和&&
。返回的值要么是空字符串(表示 false),要么是序列号(以 1 开头)表示 true。对于遇到的每个范围,都会重置序列号。范围内的最终序列号附加了字符串“E0”,这不会影响其数值,但如果您想排除端点,则可以搜索一些内容。您可以通过等待序列号大于 1 来排除起点。如果标量 "
..
" 的任一操作数是常量表达式,则如果该操作数等于 (==
) 与当前输入行号($.
变量),则认为该操作数为真。
(重点补充)