Perl:使用来自另一个标量变量的文本字符串声明标量变量

时间:2015-03-23 01:27:06

标签: perl

我是Perl的新手,我很难弄清楚如何使用来自另一个标量变量的文本字符串来声明标量变量。

我有一个数组,其中包含一系列年份,基于用户提供的输入。我需要打开与那些年份相对应的目录中包含的文件。因此,例如,如果用户输入1990-1999的年份范围,我将需要打开并分配1990年,1991年,......,1998年的文件句柄。

我想象使用以下内容,将[year]替换为$_

foreach (@year_range)
{
    my $[year]_file = "assets/[year]/file.csv";
    open my $[year]_handle, "<", $[year]_file or die "$[year]_file: $!";
}

[do stuff]
[close files using the reverse of above]

不幸的是,那不是很好。无论如何我可以完成上述工作,还是有其他方法打开文件并在运行时名称未知之前分配文件句柄?

谢谢!


更新

感谢大家的反馈意见,如果我的代表足够高,我会给你赞成票。

我有一种感觉,一次打开这么多文件可能不是最好的主意,所以我最终做的是循环打开文件,拉出我需要的信息,关闭文件,然后重复必要时,重复使用相同的句柄。

在C语言中真正编程之后,我花了一些时间来了解Perl的标量和数组 - 我甚至不知道哈希是什么东西,但我发现它们非常有用,谢谢你们提示Sobrique。

3 个答案:

答案 0 :(得分:4)

您可以使用哈希来保存文件句柄,例如

my %fh;

for my $year ( @year_range ) {
    my $dir = "assets/$year";
    mkdir $dir
    open $fh{$year}, '>', "$dir/file.csv" or die $!;
}

但是,正如TLP所说,是否有理由要求同时打开所有文件?

答案 1 :(得分:1)

我会采取一些切线,因为你已经有了一些答案。你在这里尝试做的是一个象征性的参考。

如果你出于一个简单的原因打开strict,它就不会工作 - 这是一个坏主意,而且没必要。

你看,通过允许这样的动态变量名,你可能会意外地篡改程序中其他地方的关键变量。这是制作错误的一种很好的方法,这些错误很难排除故障并进行追踪。

更重要的是 - 它没有必要,因为你可以使用哈希 - 正如鲍罗丁在他的解决方案中指出的那样。哈希是一个可移植的命名空间 - 它允许你做键值&#39;以某种方式键入关系,不会进入程序中的其他位置。

处于一个简单的层面:

my %filehandles;

open ( $filehandles{$year}, "<", "file_to_read ) or die;

你可以访问&#39;岁月&#39;在散列中:

keys %filehandles;

或句柄:

values %filehandles; 

有关更多内容,请查看此处: http://perl.plover.com/varvarname.html

答案 2 :(得分:0)

my @files=();
my @fhs=();
my $i=0;
foreach my $year (@year_range)
{
    local *FH;
    $files[$i] = "assets/".$year."/file.csv";
    open FH, "<", $files[$i] or die "$files[$i]: $!";
    push(@fhs, *FH);
    $i++; 
}

如果您不使用文件名,最终只需要一个列表(fh)。