谁能够看懂这段Perl代码吗?

谁能够看懂这段Perl代码吗?

请问谁能够讲解一下这段代码吗?特别是/^(\d+)(?\d+))?$/  and,感觉很难看懂

## Get the line range from the given spec. It may be a single number, or a
## range as in 5-10. In either case, return the pair ($begin, $end)
sub LineRange {
   local $_ = shift;
   my @range = ();
   /^(\d+)(?\d+))?$/  and  push @range, $1, (length($2) ? $2 : $1);
   return  @range;
}
看不清楚
ms语法都错了
还有那性感的表情符号
请用[code][/code]排版下
## Get the line range from the given spec. It may be a single number, or a

## range as in 5-10. In either case, return the pair ($begin, $end)

sub LineRange {
   local $_ = shift;
   my @range = ();
   /^(\d+)(?:-(\d+))?$/  and  push @range, $1, (length($2) ? $2 : $1);
   return  @range;
}
你应该看不懂( ? : )这个吧..
看perldoc perlre
里面有一段

QUOTE:
       "(?:pattern)"
       "(?imsx-imsx:pattern)"
                 This is for clustering, not capturing; it groups subexpres-
                 sions like "()", but doesn't make backreferences as "()"
                 does.  So

                     @fields = split(/\b(?:a|b|c)\b/)

                 is like

                     @fields = split(/\b(a|b|c)\b/)

                 but doesn't spit out extra fields.  It's also cheaper not to
                 capture characters if you don't need to.

                 Any letters between "?" and ":" act as flags modifiers as
                 with "(?imsx-imsx)".  For example,

                     /(?s-i:more.*than).*million/i

                 is equivalent to the more verbose

                     /(?:(?s-i)more.*than).*million/i

应该会比较容易了解.....他上面的comment已经很清楚了...
我找到相应的中文解释才看明白
请教一下大家,看看我的理解对吗?

/^(\d+)(?: -(\d+))?$/  and  push @range, $1, (length($2) ? $2 : $1);

这个的意思是:

首先找数字,(^(\d+))

然后匹配-,用?:表示无限多个-,(?: -)

然后匹配数字,((\d+))

然后后面的  ?$ 不知道什么意思。

and不知道什么意思
看小骆驼吧。
先别急着学什么正则表达式,
先把最起码的东西搞懂。
谢谢各位,这个正则表达式终于全明白了,但是其中的and,是什么意思呢?

/^(\d+)(?: -(\d+))?$/  and  push @range, $1, (length($2) ? $2 : $1);

和下面的语句等价吗?
/^(\d+)(?: -(\d+))?$/ ;
push @range, $1, (length($2) ? $2 : $1);


QUOTE:
原帖由 yuonunix 于 2008-4-9 17:04 发表
谢谢各位,这个正则表达式终于全明白了,但是其中的and,是什么意思呢?

/^(\d+)(?: -(\d+))?$/  and  push @range, $1, (length($2) ? $2 : $1);

和下面的语句等价吗?
/^(\d+)(?: -(\d+))?$/ ;
push  ...

answer is no ...

/^(\d+)(?: -(\d+))?$/  and  push @range, $1, (length($2) ? $2 : $1);


is actually work like

if ( /^(\d+)(?: -(\d+))?$/ ) {
     push @range, $1, (length($2) ? $2 : $1);
}


just kind of 'short circuit' concept in perl, another common example used this concept is


open ( FILE, 'foo.dat' ) or die ( "Failed to open file!" );