Perl:多维数组和“实验性推送”错误

czq61nw1  于 2022-11-15  发布在  Perl
关注(0)|答案(1)|浏览(161)

我是一个初级的perl程序员,对多维数组没有什么经验,我甚至不确定它是否适合这个项目。
我有一个从文件读入的客户端数组:

my @clientlist = grep(/[A-Z]\w+$/,readdir(DIR));

它会产生类似以下的清单:

$VAR1 = [
          'AA14A',
          'BB12R',
          'CC34M'
        ];

每个客户端都有一些从另一个文件中读取的未知数量的元素,这些元素与客户端名称相对应,例如:

__U_AA14A_0001, __U_AA14A_0002, __U_AA14A_0003
__U_BB12R_0001, __U_BB12R_0002, __U_BB12R_0003

当我尝试将相应的元素赋给客户端名称时:

my @allclients;
   my $header = $string;
   my $i = 0; # index in array
   foreach my $client (@clientlist) {
        push @allclients{$client}{$i}, $header;
        $i += 1;
   }

它将打印:

Useless use of push with no values at ./convert_domains.pl line 97.
Global symbol "%allclients" requires explicit package name (did you forget to declare 
"my %allclients"?) at ./convert_domains.pl line 97.
Experimental push on scalar is now forbidden at ./convert_domains.pl line 97, near "}
{"
syntax error at ./convert_domains.pl line 97, near "}{"

我还尝试了push()函数的许多变体,但它们都返回上述的一些变体。
我试着建立这样的东西:

AA14A, __U_AA14A_0001, __U_AA14A_0002, __U_AA14A_0003
BB12R, __U_BB12R_0001, __U_BB12R_0002, __U_BB12R_0003

这样我就可以遍历它并打印出各个元素。
我的主要问题是如何正确地访问多维字符串数组。我也读过这个perldoc,但是这个似乎不起作用。
https://perldoc.perl.org/perllol

wqsoz72f

wqsoz72f1#

第一点,

my @allclients;

应该是

my %allclients;

因为您需要一个associative array(即一个由字符串作为键的类似数组的结构),因此需要一个hash。
还有,

push @allclients{$client}{$i}, ...;

应该是

$allclients{$client}[$i] = ...;

push @{ $allclients{$client} }, ...;

push $allclients{$client}->@*, ...;

你想把$allclients{$client}引用的数组加上,所以@{ $allclients{$client} }$allclients{$client}->@*。请参阅Perl Dereferencing Syntax
是的,您从来没有显式地创建过任何多个数组以及对它们的引用,但是由于autovivification,这不是问题。

相关问题