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