在Perl中循环时是否可以创建不同的命名数组?我需要做的是从@ARGV
打开一些文件,并将它们的数据放入一个循环中,例如,分别放在1.txt
中的@first_array
,{{1}中的2.txt
}}等。如果可能,最好的方法是什么?
编辑:
我认为我已经接近了,因为@second_array
显示了我所需要的正确结构,但是它没有显示文件的值,而是显示了:
Data::Dumper
每个文件包含4个数字。我的代码如下:
$VAR1 = {
'skai.txt' => [
\*{'::$fh'},
$VAR1->{'skai.txt'}[0],
$VAR1->{'skai.txt'}[0],
$VAR1->{'skai.txt'}[0]
],
'numb.txt' => [
\*{'::$fh'},
$VAR1->{'numb.txt'}[0],
$VAR1->{'numb.txt'}[0],
$VAR1->{'numb.txt'}[0]
]
};
use strict;
use warnings;
use Data::Dumper;
my $data = {};
foreach my $arg(@ARGV){
if(open(my $fh, $arg)){
$data->{$arg}=[];
while(<$fh>){
chomp;
push @{$data->{$arg}}, $fh;
}
close($fh);
}
}
print Dumper $data;
是什么意思?
答案 0 :(得分:2)
听起来您确实不需要将各个数组分别命名为@first_array
,@second_array
等。您只想将它们分开。
在这种情况下,为什么不只拥有一个数组呢?像这样:
my @array_of_arrays;
for my $f (@ARGV) {
my @array = load_file($f);
push @array_of_arrays, \@array;
}
注意:load_file
只是某些功能的占位符,您可能必须将文件读入数组。
然后稍后...
array_of_arrays[0][0] * array_of_arrays[1][0] * ... * array_of_arrays[$N][0]
更新:您需要将对@array
的引用传递给push
函数,而不仅仅是@array
。否则,push
将创建一个包含每个单独数组的所有元素的扁平数组。感谢@Garo和@mob指出这一点。
答案 1 :(得分:2)
这是代码的奇怪部分:
push @{$data->{$arg}}, $fh;
$fh
是文件句柄。这就是为什么要获得该输出的原因。每次循环时,您都会在数据结构中添加完全相同的值(文件句柄)。
'skai.txt' => [
\*{'::$fh'},
$VAR1->{'skai.txt'}[0],
$VAR1->{'skai.txt'}[0],
$VAR1->{'skai.txt'}[0]
],
第一个值(\*{'::$fh'}
)只是Data :: Dumper稍微复杂的说法:“对存储在$fh
中的文件句柄的引用”。后面的三个值是Data :: Dumper,它说:“这是一个已经出现在此数据结构中的值,因此,无需再次写出该值,而是向您显示对现有值的引用”。
我认为,如果您将该行更改为:
push @{$data->{$arg}}, $_;
然后,您将获得比您想要的东西更近的东西。
答案 2 :(得分:1)
如果我正确理解了您的问题,那么您应该使用的是哈希,hashref,数组或arrayref中的arrayreferences。
以下是我的操作方式(arrayrefs的hashref):
my $data={}; #a hashref where all data will end up
foreach my $currentfile (@ARGV){
open (my $filehandle ,$currentfile);
$data->{$currentfile}=[]; #a empty arrayref inside the hashref for every file
while(<$fh>) {
push @{$data->{$currentfile}}; #add lines to the arrayref
}
close $filehandle;
}
结果:所有数据将以$data->{FILENAME}->[LINENUMBER COUNTING FROM 0]
的形式提供。
示例:文件“ foo.txt”的第7行现在位于$data->{foo.txt}->[6]
根据您的实际目的,使用数组或arrayref可能比使用hashref更好(如果您不关心文件名,而是关心@ARGV
中的参数个数)。但这在您的问题中并不完全清楚