【发布时间】:2018-03-04 05:34:55
【问题描述】:
我用 smartmatch 检查字符串是否与正则表达式模式匹配。在我决定将正则表达式存储在文本文件中后,它就停止工作了。
my $str = '123456, some text.';
my $regex = qr/^\d+, some text\.$/;
print "Regex: $regex\n";
此时,打印的正则表达式为(?^:^\d+, some text\.$)。我将它复制粘贴到一个文件中,然后让代码读取文件并检索存储在$regexFromFile 中的正则表达式。
以下行确认$regex 和$regexFromFile 相同,然后我继续以各种方式针对正则表达式测试$str。
print 'Is regex equal to regexFromFile? ' . ($regex eq $regexFromFile) . "\n";
print 'Does str match regex using =~ ? ' . ($str =~ $regex) . "\n";
print 'Does str match regexFromFile using =~ ? ' . ($str =~ $regexFromFile) . "\n";
print 'Does str match regex using ~~ ? ' . ($str ~~ $regex) . "\n";
print 'Does str match regexFromFile using ~~ ? ' . ($str ~~ $regexFromFile) . "\n";
该代码的最后一行与前三行不同。
这是代码的完整输出:
Regex: (?^:^\d+, some text\.$)
Is regex equal to regexFromFile? 1
Does str match regex using =~ ? 1
Does str match regexFromFile using =~ ? 1
Does str match regex using ~~ ? 1
Does str match regexFromFile using ~~ ?
(注意最后没有1。)
编辑:要回答评论,这里是文件的读取方式。
open(my $FILEHANDLE, 'file.txt') or die "Error: Could not open file.\n";
my @content = <$FILEHANDLE>;
close($FILEHANDLE) or print "Could not close file.\n";
my @content_woEol = ();
foreach my $line (@content){
$line =~ s/\s*$//;
push(@content_woEol, $line);
}
my $regexFromFile = $content_woEol[0];
【问题讨论】:
-
你能展示你如何检索
$regexFromFile吗? -
更糟糕的是,已知 smartmatch 已损坏。 问为什么损坏的代码会这样是没有用的。
标签: regex perl smartmatch