Perl:变量中的变量字符串

时间:2017-02-04 07:43:50

标签: string perl variables

以下是我尝试做的一个例子: 我想"定义"输入的名称,然后当它被带入函数时,它才会替换所有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行以便能够按照我想要的输出吗?我不想在子程序中定义输入名称,它必须在主程序中。

4 个答案:

答案 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 referenceanonymous 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"; }