通过循环创建不同的数组

时间:2019-03-20 22:43:48

标签: arrays file perl loops

在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; 是什么意思?

3 个答案:

答案 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中的参数个数)。但这在您的问题中并不完全清楚