疑惑,求教!

疑惑,求教!

实实在在的看了perl半个月,有疑问,求教!

#!/usr/bin/perl
use warnings;
use strict;

while (<>{
       chomp;
       if (/^http:\/\//){
              print "it's http_\n";
          } elsif (/[^http:\/\/].*/) {
              print "it isn't http_\n";
         } else {
     print;
   }
}

输入:
http://www.163.com
hwww.163.com
whww.163.com
www.163.com

输出:
it's http:http://www.163.com
it isn't http:hwww.163.com
it isn't http:whww.163.com
it isn't http:www.163.com

关于/^http:\/\//与[^http:\/\/]

我的理解:在输入的第2行:hwww.163.com应该不是与[^http:\/\/].*匹配,应该转到else直接输出:hwww.163.com,不明白

请热心的朋友多指点,万分感谢!!


QUOTE:
原帖由 zhujinzz 于 2008-5-16 17:26 发表
实实在在的看了perl半个月,有疑问,求教!

#!/usr/bin/perl
use warnings;
use strict;

while (){
       chomp;
       if (/^http:\/\//){
              print "it's http_\n";
          }  ...

没错
你的代码又没有限定匹配的起始点是在字符串的开头
我想你是把character class这个东西弄混了
[^abcd]
表示匹配一个非a,b,c,d的字符
而你写的character class里面居然都还有相同的字符(\/),所以你肯定想错了
我想你需要的大概是如下的代码:

[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl
use strict;
use warnings;
while (<>){
  chomp;
  if ( m#^(?=http://)# ) {
    print "it is http -> $_\n";
    } elsif ( m#^(?=[^:]+://)# ) {
    print "It is not http -> $_\n";
    } else {
    print "$_\n";
  }
}

测试数据

QUOTE:
http://www.163.com
ftp://www.163.com
wokao://www.163.com
whww.163.com
www.163.com

运行结果

QUOTE:
it is http -> http://www.163.com
It is not http -> ftp://www.163.com
It is not http -> wokao://www.163.com
whww.163.com
www.163.com

非常感谢churchmice 兄,接触perl时间短,这个m#^(?=[^:]+://)#  看的不懂,请指点?
m#^(?=[^:]+://)#就是/^(?=[^:]+:\/\/)/,只是不用在/之前使用\
m表示匹配运算,//是其简写形式
主要是?=[^:]+,能不能详细解释下?谢谢!!


QUOTE:
原帖由 zhujinzz 于 2008-5-18 20:43 发表
主要是?=[^:]+,能不能详细解释下?谢谢!!



[Copy to clipboard] [ - ]
CODE:
?=pattern

向前看,它匹配的是一个位置,在这个位置的右边是pattern

[Copy to clipboard] [ - ]
CODE:
[^:]+:

表示匹配一个或者多个非:字符,结果就是匹配:前面的内容

所以

[Copy to clipboard] [ - ]
CODE:
?=[^:]+:

匹配的只是一个位置,这个位置的右边是xxxx:的形式
当然你也可以简单的用

[Copy to clipboard] [ - ]
CODE:
.+:

但是这个考虑到+是贪婪的,如果字符串中有两个:,你就挂了,
所以建议改成非贪婪

[Copy to clipboard] [ - ]
CODE:
.+?:

谢谢churchmice和Monox兄,大部分已经明白了,还有?=这个东东,在小骆驼的正则表达式有关章节没提到过,google上找资料:肯定的预见匹配语法为/pattern(?=string)/ ,还是很模糊?基础太差,问题也多,请多点耐心指点
看mastering regular expression pattern
正则表达式介绍的相当详细