Perl里面正则不匹配多个连续字符串时该怎么写?

Perl里面正则不匹配多个连续字符串时该怎么写?

Perl里面正则不匹配多个连续字符串时该怎么写?
想要匹配的文件名是类似: xxx.pl,但是不能是类似 xxx_S.pl这样的形式,文件后缀必须是.pl
试了一下下面的代码,不是我想要的。

[quote]
my @t = (
"ab.pl",
"abs.pl",
"abS.pl",
"ab .pl",
"ab_.pl",
"ab_S.pl",
"ab_S.bat",
"abc.bat"
);
my $i;
for($i=0;$i<@t;$i++){
print "Matched => [".$t[$i]."]\n" if $t[$i] =~ /(.*)(?!_S)\.pl/;
}
[/quote]

期待的结果应该是:
[quote]
Matched => [ab.pl]
Matched => [abs.pl]
Matched => [abS.pl]
Matched => [ab .pl]
Matched => [ab_.pl]
[/quote]

但实际结果是:
[quote]
Matched => [ab.pl]
Matched => [abs.pl]
Matched => [abS.pl]
Matched => [ab .pl]
Matched => [ab_.pl]
[b]Matched => [ab_S.pl][/b]
[/quote]

多了那个最后一行,我不知道哪里出问题了,请教各位指正。
可能是对(?:)这种模式的理解还不够。




   

试试:--[quote]--pri.
试试:
[quote]
print "Matched => [ $t[$i] ]\n" if $t[$i] =~ /^[a-zA-Z0-9_]*\s*\.pl/;
[/quote]
[quote]my @t = (-- .
[quote]my @t = (
"ab.pl",
"abs.pl",
"abS.pl",
"ab .pl",
"ab_.pl",
"ab_S.pl",
"ab_S.bat",
"abc.bat"
);

for(0..$#t){
print "Matched => [".$t[$_]."]\n" if $t[$_] !~ m/_S.pl$/ && $t[$_] =~ m/\.pl/;
}
[/quote]
第二种方法 :-- [quo.
第二种方法 :
 [quote]my @t = (
"ab.pl",
"abs.pl",
"abS.pl",
"ab .pl",
"ab_.pl",
"ab_S.pl",
"ab_S.bat",
"abc.bat"
);

for(0..$#t){
print "Matched => [".$t[$_]."]\n" if $t[$_] =~ m/(?<!_S)\.pl/ ;
}
[/quote]
--/[^_].\.pl/--.

/[^_].\.pl/
4楼的方法,如果还有“ab_.
4楼的方法,如果还有“ab_aa.pl”呢?
5楼的方法,如过还有"ab_SS.pl"呢?
目的是 *.pl 吧?--/\.p.
目的是 *.pl 吧?
/\.pl$/
就可
谢楼上兄弟们的回复
问题我已经在第一个帖子里面说的很清楚了:

[b]想要匹配的文件名是类似: xxx.pl,但是不能是类似 xxx_S.pl这样的形式,文件后缀必须是.pl[/b]

2楼,5楼的基本不符我的需要

3楼的结果是可以的,但我这边需要的只能写一个匹配模式

4楼正是我要问的,结果完全正确而且符合要求,但是就是不懂中间这个<具体起什么作用,为啥去掉之后匹配结果就出错了

[CCB]10[/CCB]




   

哈哈,看一下retut你就知道.
哈哈,看一下retut你就知道了,?!是向后匹配,一般用于xx(?!XXX).就是匹配XX后面不带XXX的
而?<! 用于向前匹配,一般用于(?<!XXX)XX这样的形式.就是匹配XX前不是XXX的.

看一下retut吧,安装perl的时候带的,看完了你就知道其实这个正则表达式真是深奥啊,有很多可能自己也不知道的用法.:)昨天我也是看了半小时才发现的这个?<!的用法,平时根本就不用啊.
楼主也是让我重新又重温了一次正则啊,哈哈.
呵呵,客气了
多谢指教,学习perl没多久,不太懂,见笑了。

这个 ?<! 算是学会了 [CCB]1[/CCB]