Perl 使用变量作为文件名

Perl use variable as a file name

如何创建名称包含变量且变量之间有下划线的文件。我需要创建一个名称类似于 $variable1_$vraiable2_$variable3.txt

的文件
@values=split(/\./, $line)
my $fpga_name=$values[0];
my $block_name=$values[1];
my $mem_name=$values[2];
my $memfilename="mem_init/$fpga_name_$block_name_$mem_name.txt";
open(WRITE_MEM_FILE, ">>memfilename");
print WRITE_MEM_FILE "$line \n";

您可以简单地将所有变量括在花括号中:

my $memfilename="mem_init/${fpga_name}_${block_name}_${mem_name}.txt";

请记住,在您的 open 语句中 memfilename 之前需要一个 $,否则您只会得到文字字符串:

open(WRITE_MEM_FILE, ">>$memfilename");

通过写作 ${varname}:

来指示变量名称开始和结束的位置
my $memfilename="mem_init/${fpga_name}_${block_name}_${mem_name}.txt";

问题是你是否需要中间数组,以及三个额外的变量。如果没有,你可以把整个事情写成:

my $memfilename = sprintf(
    '%s_%s_%s.txt',
    split(/[.]/, $line, 3), # whether you want 3 here depends on your input
);

如果你确实需要三个中间变量,你仍然可以跳过 @value 数组的创建并写一些比将三个变量插入一个字符串更清晰的东西:

my ($fpga_name, $block_name, $mem_name) = split /[.]/, $line, 3;
my $memfilename = sprintf '%s_%s_%s.txt', $fpga_name, $block_name, $mem_name;

使用 sprintf 生成的代码比插入三个变量、大括号、下划线、符号等更具可读性

或者,您也可以使用:

 my $memfilename = sprintf '%s.txt', join('_', split /[.]/, $line, 3);

同样,您是否想要 split 的第三个参数取决于您的输入。

最后,如果您发现自己在不止一个地方这样做,将它放在一个函数中会有所帮助

sub line_to_memfilename {
    my $line = shift;
    # ...
    return $memfilename;
}

因此,如果格式发生变化,您只需在一个地方进行更改。