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

时间:2011-05-15 14:17:48

标签: regex perl

Howdie

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

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

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

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

现在我正在做一个Perl脚本,告诉我一个给定的字符串是否与我的库中的给定正则表达式匹配。例如,

perl my-script.pl email john@example.com

脚本应该在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.我知道它找到了文件并成功读取了它的内容,因为我调试了它。我做错了什么?

3 个答案:

答案 0 :(得分:2)

您可能会在这些或者标题上添加新行。尝试在你读的字符串上运行chomp。很难说不知道文件是什么样的。

答案 1 :(得分:1)

您是否考虑过查看Regexp::Common

这可能无法直接解决您的问题,但可以帮助您进行分类,并且它已经包含了一些您可能会觉得有用的非常常见的正则表达式。

答案 2 :(得分: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),而不是脚本。< / p>