我正在尝试更新一段代码以删除任何非字母数字字符,将结果字符串分配给新变量,并重写我的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;
}
知道为什么特殊字符删除脚本会让我失望吗?
谢谢!
答案 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///
?