Chinaunix

标题: perl中“..”操作符含义 [打印本页]

作者: aple_smx    时间: 2009-02-16 10:27
提示: 作者被禁止或删除 内容自动屏蔽
作者: ynchnluiti    时间: 2009-02-16 13:02
原帖由 aple_smx 于 2009-2-16 10:27 发表
在下面这个帖子中有这样一个表达式 “$ perl -ne 'print unless /^$/../^$/' input“
http://bbs3.chinaunix.net/thread-1333381-1-1.html

对这里..操作符的含义不了解(根据各位大虾的回复猜测类似于"或"), ...

跟或不同。

在标量环境里,.. 返回一个布尔值。该操作符是双稳定的,类似一个电子开关,。。每个 .. 操作符都维护自身的状态。只要它的左操作数为假就一直为假。一旦左操作数为真,该范围操作符就保持真的状态直到右操作数为真,右操作数为真之后该范围操作符再次为假。。。

返回的值要么是代表假的空字串或者是代表真的一个序列数(从 1 开始)。该序列数每次碰到新范围时重置。在一个范围里的最后序列数后面附加了字串“E0”,这个字串不影响它的数字值,只是给你一些东西让你可以搜索,这样你可以把终点排除在外。你也可以通过等待 1 的序列数的方法把启始点排除在外。如果标量 .. 的某个操作数是数字文本,那么该操作数隐含地与 $.变量对比,$. 里包含你的输入文件的当前行号


perldoc perlop
Range Operators
作者: aple_smx    时间: 2009-02-16 13:18
提示: 作者被禁止或删除 内容自动屏蔽
作者: MMMIX    时间: 2009-02-16 14:02
原帖由 aple_smx 于 2009-2-16 13:18 发表


谢谢,有点高深,我再研究一下

注意看 perlop 讲解 .. 后的例子就好理解了。
作者: flw    时间: 2009-02-16 14:24
这个问题在本坛光我一个人就回复过至少五次了。
作者: shaneqi    时间: 2009-02-16 15:30
原帖由 MMMIX 于 2009-2-16 14:02 发表

注意看 perlop 讲解 .. 后的例子就好理解了。

后面的例子挺清楚
As a scalar operator:

           if (101 .. 200) { print; } # print 2nd hundred lines, short for
                                      #   if ($. == 101 .. $. == 200) ...

           next LINE if (1 .. /^$/);  # skip header lines, short for
                                      #   ... if ($. == 1 .. /^$/);
                                      # (typically in a loop labeled LINE)

           s/^/> / if (/^$/ .. eof());  # quote body

           # parse mail messages
           while (<>) {
               $in_header =   1  .. /^$/;
               $in_body   = /^$/ .. eof;
               if ($in_header) {
                   # ...
               } else { # in body
                   # ...
               }
           } continue {
               close ARGV if eof;             # reset $. each file
           }

       Here's a simple example to illustrate the difference between the two
       range operators:

           @lines = ("   - Foo",
                     "01 - Bar",
                     "1  - Baz",
                     "   - Quux");

           foreach (@lines) {
               if (/0/ .. /1/) {
                   print "$_\n";
               }
           }
作者: girlbird    时间: 2009-02-19 13:55
/^$/ 是啥意思?
作者: ynchnluiti    时间: 2009-02-19 14:12
原帖由 girlbird 于 2009-2-19 13:55 发表
/^$/ 是啥意思?

空行
作者: MMMIX    时间: 2009-02-19 15:00
原帖由 ynchnluiti 于 2009-2-19 14:12 发表

空行

应该是空字符串才对,许多情况下空行和空字符串并不一样。
作者: DQP    时间: 2009-02-19 16:34

  1. print 'hi' if "\n" =~ m/^$/;
  2. print '\n equle to empty string' if "\n" eq '';
复制代码

还和空串有点区别 可以包含一个\n
作者: MMMIX    时间: 2009-02-19 17:33
原帖由 DQP 于 2009-2-19 16:34 发表

print 'hi' if "\n" =~ m/^$/;
print '\n equle to empty string' if "\n" eq '';

还和空串有点区别 可以包含一个\n

嗯,$ 会忽略最后的 \n
作者: xiaobing927    时间: 2009-07-29 16:13
原帖由 MMMIX 于 2009-2-19 17:33 发表

嗯,$ 会忽略最后的 \n


太牛了,牛牛牛~~
作者: cxfcxf    时间: 2009-07-29 16:20
就是range operator...
.. ...




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2