2011-05-15 72 views
1

Howdieperl从文件中读取正则表达式

我已经将我使用最多的所有正则表达式归类为库文件。举一个虚拟的例子,我有一个叫做/mysdk/library/regex/email/match与文件的内容:

^[a-z]@[a-z]\.com$ 

(我知道这是不好的正则表达式,但是这对于例如:))。而且我有很多与常用的正则表达式的文件夹:

/library 
    /regex 
    /email 
    /url 
    /social_security 
    ... 

现在我正在做一个Perl脚本,会告诉我,如果给定的字符串从我的图书馆给定的正则表达式匹配。例如,

perl my-script.pl email [email protected] 

而脚本应该在false上打印0,在true上打印1。但它不工作:(这是我的脚本:

if($ARGV[1]) 
{ 
    if(open(REGEX_CONSTANT,"/mysdk/library/regex/$ARGV[0]/match")) 

    { 
     $regex_constant=<REGEX_CONSTANT>; 
     close(REGEX_CONSTANT); 

     if($ARGV[1] =~ m/$regex_constant/) { print 1; exit } 
    } 

    print 0 
} 

else 

{ 
    print 0 
} 

我也试过

if($ARGV[1] =~ m/($regex_constant)/) { print 1; exit } 

即使字符串应该匹配,它打印0。我知道它找到的文件和成功读取它的内容,因为我已经调试过了。我做错了什么?

回答

2

你可能会在这些行上换行符,或者可能是头文件。尝试在读取的字符串上运行chomp。知道这些文件是什么样的。

+0

谢谢你,这是关系到尾随的​​新行! – francoisrv 2011-05-15 14:47:51

1

你有没有考虑看Regexp::Common

这也许不能直接解决您的问题,但可以帮助你进行分类,其已经包括了一些很常见的正则表达式的可能对你有用。

+0

有趣!目前,我宁愿拥有库文件,因为我用Bash和PHP(现在是Perl和Python)编码,所以它更具可移植性。但在我学习Perl的过程中,它确实有助于:) – francoisrv 2011-05-15 14:49:45

1

而不是将正则表达式中的文件,你可能会考虑把它们的模块中:

# In FavoriteRegex.pm. 
package FavoriteRegex; 

use strict; 
use warnings; 

use parent qw(Exporter); 
our @EXPORT = qw(); 
our @EXPORT_OK = qw(%FAVS); 

our %FAVS = (
    foo  => qr/foo/, 
    integer => qr/\A\d+\Z/, 
); 

1; 

脚本需要那些正则表达式变得更加简单:

# In some_script.pl. 
use strict; 
use warnings; 

use FavoriteRegex qw(%FAVS); 

say 'foo'  if 'blah foo blah' =~ $FAVS{foo}; 
say 'integer' if '1234'   =~ $FAVS{integer}; 
say 'integer?!?' if '1234.0'  =~ $FAVS{integer}; 

即使你的项目要求正则表达式存在于它们自己的非Perl文件中,读取这些文件的工作应该在模块中完成(本例中为FavoriteRegex.pm),而不是脚本。