以下是我尝试做的一个例子: 我想"定义"输入的名称,然后当它被带入函数时,它才会替换所有3个变量。
$place_holder = 'f${file_case}_lalal_${subcase}_${test}';
....在另一个函数的其他地方:
读取包含3行数字的文件,每行代表$ file_case,$ subcase,$ test
while(<IN>){
($file_case, $subcase, $tset) = split;
$input = $place_holder #### line #3 here needs to fix
print " $input \n";
}
不幸的是,它为每一行打印出f $ {file_case} lalal $ {subcase} _ $ {test}。我想要替换这些变量。我该怎么做,怎么做 我可以更改第3行以便能够按照我想要的输出吗?我不想在子程序中定义输入名称,它必须在主程序中。
答案 0 :(得分:3)
您可以使用子例程来执行此操作,例如,如果它符合您的条件
use warnings;
use strict;
my $place_holder = sub {
my ($file_case, $subcase, $test) = @_;
return "f${file_case}_lalal_${subcase}_${test}";
}
# ...
while (<IN>) {
my ($file_case, $subcase, $tset) = split;
#
# Code to validate input
#
my $input = $place_holder->($file_case, $subcase, $tset);
print "$input\n";
}
我已经使用code reference和anonymous subroutine预期可以从中受益的用途,但仅针对指定的任务,您也可以使用普通的子例程。
请注意,您有$test
和$tset
,这不会影响上述情况,但可能是拼写错误。
答案 1 :(得分:2)
您可以使用String::Interpolate
模块,例如
use String::Interpolate 'interpolate';
my $place_holder = 'f${file_case}_lalal_${subcase}_${test}';
while ( <IN> ) {
my ($file_case, $subcase, $test) = split;
my $input = interpolate($place_holder);
print "$input\n";
}
该模块可以访问Perl的内置C代码,执行双引号插值,因此通常快速准确
答案 2 :(得分:0)
发布后不久,我找到了办法。
<#>第3行,请执行以下操作:($ input = $ place_holder)= ~s /(\ $ {w +})/ $ 1 / eeg;
一切正常。是的,上面的tset是一个错字,意思是测试。感谢大家的回复。
答案 3 :(得分:-1)
尝试 eval while(<IN>){ ($file_case, $subcase, $tset) = split; $input = eval $place_holder #### line #3 here needs to fix print " $input \n"; }