perl - Perl - 对数组使用tr

我正在尝试使用tr函数指定两个数组,作为to和from集。

我加载数组(这部分工作):

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



结果与进入的数据相同。似乎没有发生任何转换,我做错了什么?

时间:

我想你是跟tr///一起的,因为它比s///快,

除了使,它可以多次使用编译后的tr///,以下修复Perl和tr语法错误以及注入Bug :


my $from_set = join '', @from_set;


my $to_set = join '', @to_set;



my $tr = eval("sub { $_[0] =~ tr/Q$from_setE/Q$to_setE/r }")


 or die($@);



my $output = $tr->($input);



使用s///


my %map; @map{@from_set} = @to_set;


my $from_set = join '', @from_set;


my $re = qr/([Q$from_setE])/;



my $output = $input =~ s/$re/$map{$1}/gr;



你的$statement有点过时,因为普通的形式是$line =~ tr/a/b/,对吧? 所以应该是这样:


my $statement ="$line =~ tr/@from_set/@to_set/;"



期间$line应该保持一个变量,因此它作为$line被转义,@from_set和@to_set的内容应该插入到$ statement中。


eval sprintf"tr/%s/%s/", map quotemeta, $oldlist, $newlist;



https://www.perlmonks.org/?node_id=445971

...