新手求助 正则表达式

新手求助 正则表达式

文件ngs.pl
#!/usr/bin/perl -w

use strict;
my $file_name=$ARGV[0];
open FILE_NAME,$file_name or die "can't open file";
if (<FILE_NAME>=~/(define.*}$)/s)
{
    print $1;
}

文件abc
define{
abcdef
}

执行perl ngs.pl abc
好像匹配不到,这个正则表达式应该怎么写?

#!/usr/bin/perl

use strict;
use warnings;

if ((join '', <DATA>) =~ /(define.*)/s){
    print $1;
}

__DATA__
define{
abcdef
}


QUOTE:
原帖由 adminsinx 于 2008-12-22 14:05 发表
文件ngs.pl
#!/usr/bin/perl -w

use strict;
my $file_name=$ARGV[0];
open FILE_NAME,$file_name or die "can't open file";
if (<FILE_NAME>=~/(define.*}$)/s)
{
    print $1;
}

这个之所以失败,是因为 <FILE_NAME> 在 =~ 左边,处于 scalar context,因此一次只从 FILE_NAME 中读取一行(根据 $/ 的值来确定什么是一行)。

因此解决你的问题有两种方式,
1. 把 <FILE_NAME> 放到 list context 中,然后把它的结果 join 起来,就像 cobrawgl 所建议的
2. 你也可以通过修改 $/ 重新定义什么是一行,例如在 if 之前加一行 local $/;

详见 perlvar 对 $/ 的描述,perlop 对 =~ 的描述。


QUOTE:
原帖由 MMMIX 于 2008-12-22 14:45 发表

这个之所以失败,是因为  在 =~ 左边,处于 scalar context,因此一次只从 FILE_NAME 中读取一行(根据 $/ 的值来确定什么是一行)。

因此解决你的问题有两种方式,
1. 把  放到 list context 中,然后把它 ...

遇到括号就忘了里面的=~