为什么此代码段中的“搜索模式未终止”?

时间:2016-12-10 00:57:59

标签: regex perl

我正在尝试更新一段代码以删除任何非字母数字字符,将结果字符串分配给新变量,并重写我的HTML以将该值包含在新元标记中:

if ( $main::url =~ m/index:Devices/ )
{
    my $prodname = getMetaValue(\$doc,'Product_Name');
    $prodname =~ tr/[^a-zA-Z0-9 ];
    $strippedname =~ $prodname;
    $doc =~ s{</head>}{<meta name='Stripped_Name' content='$strippedname' />\n</head>}is;
}

最后一行抛出“搜索模式未终止”错误,我无法弄清楚原因。我使用类似的方法在脚本的其他地方工作:

if ( $main::url =~ m/index:Devices/ )
{
    my $prodname = getMetaValue(\$doc,'Product_Name');
    my $brandname = getMetaValue(\$doc,'Manufacturer_Name');
    my $devicefullname = $brandname.' '.$prodname;
    $doc =~ s{</head>}{<meta name='Device_Full_Name' content='$devicefullname' />\n</head>}is;
}

知道为什么特殊字符删除脚本会让我失望吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

tr运算符的语法为tr/CHARS/REPLACEMENT/。此外,它执行音译(非正则表达式匹配),通常会以相当特殊的方式替换指定的文字字符。

但是可以使用tr执行您想要的操作,因为它允许范围并且具有/c修饰符(补充

$prodname =~ tr/a-zA-Z0-9 //dc;

来自Quote-Like-Operators in perlop

  

如果指定了/ c修饰符,则补充SEARCHLIST字符集。

但是,使用tr///(特别是/c)与使用s///相比有点模糊,后者也会在代码中使用s///。使用$prodname =~ s/[^a-zA-Z0-9 ]//g; 会更清楚

/g

修饰符[^...]使其删除由s/[^a-z\d ]//gi; 指定的所有出现的字符。

正则表达式本身也可以写成

/i

但请参阅否定 in perlrecharclass,了解使用带有否定类和unicode的+的注释。为了提高效率,我们可以添加s/[...]+//gi量词tr///,因为无论如何都需要删除所有出现的量词。请注意,此处s/[^[:alnum:] ]//g;应该更多

使用 POSIX字符类,可以将其写为 my $request = $r->as_string //$r is the HTTP::Request object $request =~ s/^[^\n]*\n//s; my $parser = MIME::Parser->new(); $parser->output_to_core(1); my $ent = $parser->parse_data(); my $part1 = $ent->parts(0); // First file my $filename1 = $part1->head->recommended_filename my $content1 = $part1->bodyhandle->as_string my $part2 = $ent->parts(1); // Second file my $filename1 = $part2->head->recommended_filename my $content1 = $part2->bodyhandle->as_string

答案 1 :(得分:2)

tr///需要三个分隔符实例,而不仅仅是一个。

$prodname =~ tr/[^a-zA-Z0-9 ];

此外,[表示tr中的文字方括号。也许您想要m//s///