我试图使用tr函数指定两个数组,作为to和from集合。翻译似乎不起作用,或者我无法正确理解。我是perl的新手,所以如果我做错了事,请告诉我
open my $fh,'<',"${main_dir}/char_convert" or die "Cannot open allowed conversion file";
my @from_set;
my @to_set;
my @conversion;
while (my $lines = <$fh>) {
@conversion = split(" ",$lines);
push @from_set,$conversion[0];
push @to_set,$conversion[1];
}
#The variable $line holds the data I want converted:
my $statement;
my $result;
$statement = "tr\@from_set\@to_set\$line;"; # Setup the tr command
$result = eval($statement); # perform the conversion
print "$line\n";
Run Code Online (Sandbox Code Playgroud)
结果与输入的数据相同。似乎没有进行任何转换。我究竟做错了什么?
数据的示例部分是“PICAÑA”。转换文件中的行是“ÑN”,所以我希望得到“ PICANA”,但是我得到了原始数据
谢谢看
我假设您选择了,tr///
因为它比快s///
。如果是这样,eval
每次进行翻译都会违反目的。如果您只使用eval
一次,但是执行多次音译,它将更快。
除了可以tr///
多次使用编译后,以下还修复了Perl语法错误以及代码注入错误:
my $from_set = join '', @from_set;
my $to_set = join '', @to_set;
my $tr = eval("sub { \$_[0] =~ tr/\Q$from_set\E/\Q$to_set\E/r }")
or die($@);
my $output = $tr->($input);
Run Code Online (Sandbox Code Playgroud)
另一方面,如果您只执行一次音译,那么您将使生活变得更加复杂,并且使用会使程序变慢tr///
。使用s///
代替。
my %map; @map{@from_set} = @to_set;
my $from_set = join '', @from_set;
my $re = qr/([\Q$from_set\E])/;
my $output = $input =~ s/$re/$map{$1}/gr;
Run Code Online (Sandbox Code Playgroud)