为什么这个正则表达式来自一个不能与smartmatch一起使用的文本文件?

时间:2018-03-01 14:30:19

标签: regex perl smartmatch

我用 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];

3 个答案:

答案 0 :(得分:4)

智能匹配已被破坏。请避免使用它。 [1]

$str是一个字符串,$regexFromFile是一个字符串,因此$str ~~ $regexFromFile相当于$str eq $regexFromFile

如果您希望$str ~~ $regexFromFile等同于$str =~ $regexFromFile,则必须将名称错误的$regexFromFile从字符串转换为正则表达式(例如,使用qr// )。当然,更好的解决方案是简单地使用=~

  1. 许多年前,它被作为一种弃用形式进行实验,因此可以修复。继续使用这个破碎的功能实际上阻止了最近修复它的努力。

答案 1 :(得分:2)

qr//的结果实际上是预编译的正则表达式。将打印的正则表达式复制粘贴到文件中,然后将其从文件中读取,这不是问题。如果直接在代码中编写此行,您会遇到相同的行为:

my $regexFromFile = '(?^:^\d+, some text\.$)';

如果你想在这里使用smatmatch,我会建议你做以下的事情:

my $str   = '123456, some text.';
my $regex = '^\d+, some text\.$';

# Manually store this in the file: ^\d+, some text\.$
# Read $regexFromFile from the file

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";

请注意额外的/.../。输出:

Does str match regex         using =~ ? 1
Does str match regexFromFile using =~ ? 1
Does str match regex         using ~~ ? 1
Does str match regexFromFile using ~~ ? 1

答案 2 :(得分:-1)

Smartmatch 自v5.18以来一直是 experimental ,并且绝不应该在实时制作软件中使用

始终需要

fasta_records = SeqIO.parse('Input.fasta', 'fasta')
fastq_records = SeqIO.parse('Input.fastq', 'fastq')

def yield_records():
    for fasta_record, fastq_record in zip(fasta_records, fastq_records):
        fastq_record.seq = fasta_record.seq
        yield fastq_record

除非你是有意识或明确忽略警告的人,否则

private string x;
public Titles(string strToDisplay)
    {
        InitializeComponent();
        x = strToDisplay;
    }


    private void titleList_SelectedIndexChanged(object sender, EventArgs e)
    {
        // Now you can access here
    }

然后你会对它的死亡发出充分的警告

你做出明智的选择,从一开始就明显错误