出现这种警告大家一般怎么解决

出现这种警告大家一般怎么解决

我执行

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


$2有时候赋了值,有时候没有赋值,在没有赋值时,会出现这样的警告:


Use of uninitialized value in length at cdiff.pl line 692, <CLEARDIFF> line 5.  请问这种问题一般怎么解决?是不管它吗?还是。。。。。

说实话,我也很烦这个信息。
不过通常来说,这个信息大多都意味着程序设计时考虑的不太周到的地方,
鉴于这个原因,我一般都会修改程序以避免出现这个信息。

如果你的确认为自己的做法是正确的,你可以用
no warnings 'uninitialized';
来关掉它。
改改程序就行了。别对未定义的值取length。

——突然发现lz的判断方法有些问题。
如果匹配了$2,那么$2的length就不可能是0——因为它是 \d+;
所以$2只有两种情况: undef(未匹配),或者是一个数字组成的字符串。

因此只要判断 defined($2) 就可以了。
/^(\d+)(?\d+))?$/  and  push @range, $1, (length($2) ? $2 : $1);

这段正则表达式应该怎么理解呢?
1.第一个问号前面并没有先导字符,那为什么这么用呢?
2.$2指的是哪一个匹配变量呢,感觉(?\d+))存在嵌套关系,那$2指的是(\d+)吗?
4楼去补习正则表达式去~

() 有两个作用,一是分组,二是捕获(即将匹配保存到$1, $2...)

(?: )  是非捕获型分组,只有分组功能没有捕获

所以 $1 就是第一个(\d+)   $2就是第二个 (\d+)
谢谢!楼上的兄弟!

我差距实在是太大了,呵呵,这就去补!


QUOTE:
原帖由 flw 于 2008-4-10 13:47 发表
说实话,我也很烦这个信息。
不过通常来说,这个信息大多都意味着程序设计时考虑的不太周到的地方,
鉴于这个原因,我一般都会修改程序以避免出现这个信息。

如果你的确认为自己的做法是正确的,你可以用
...

偶觉得这个是正解,如果程序代码不是很复杂,建议重新修改程序,
但是使用第2种方法的话,对于其他的一切同样的错误就不能显示出来,会造成一点点麻烦。。。
修改程序稳妥点。