Arrays 如何在Perl中创建变量数组名?

Arrays 如何在Perl中创建变量数组名?,arrays,perl,variables,Arrays,Perl,Variables,Array@p是一个多行数组,例如,$p[1]是第二行 这段代码将解释我想要什么: $size=@p; # line number of array @p for($i=0; $i<$size; $i++) { @p{$i}= split(/ +/,$p[$i]); } 等等 但是上面的代码不起作用,我该怎么做呢?首先,语法@p{$I}在哈希%p中使用键$I访问条目,并在列表上下文中返回它。我想你不是那个意思使用严格;使用警告以获得有关未声明变量的警告 您可以使用my声明变量,

Array@p是一个多行数组,例如,$p[1]是第二行

这段代码将解释我想要什么:

$size=@p;   # line number of array @p
for($i=0; $i<$size; $i++)
{ 
  @p{$i}= split(/ +/,$p[$i]);
}
等等


但是上面的代码不起作用,我该怎么做呢?

首先,语法
@p{$I}
在哈希
%p
中使用键
$I
访问条目,并在列表上下文中返回它。我想你不是那个意思<代码>使用严格;使用警告以获得有关未声明变量的警告

您可以使用
my
声明变量,例如
my@p
我的$size=@p

动态创建变量名是可能的,但这是一种糟糕的做法。好的是我们不需要这样做:Perl有引用。对数组的引用允许我们嵌套数组,例如

my @AoA = (
   [1, 2, 3],
   ["a", "b"],
);
say $AoA[0][1]; # 2
say $AoA[1][0]; # a
我们可以使用括号创建数组引用,例如
[@array]
,或通过引用运算符
\

my @inner_array = (1 .. 3);
my @other_inner = ("a", "b");
my @AoA = (\@inner_array, \@other_array);
但是要小心:数组引用仍然指向与原始名称相同的数组,因此

push @other_inner, "c";
同时更新
@AoA
中的条目:

say $AoA[1][2]; # c
这意味着您需要:

my @pn;
for (@p) { 
  push @pn, [ split /[ ]+/ ];
}
还有很多其他的表达方式,例如

my @pn = map [ split /[ ]+/ ], @p;

要了解有关参考资料的更多信息,请阅读

  • ,
  • ,及

    • 动态生成变量名是个坏主意

      我建议最好的解决方案是将
      @p
      数组中的每一行转换为字段数组

      假设您对
      @p
      有一个更好的名称,比如说
      @lines
      。然后你就可以写了

      my @lines = map [ split ], <$fh>;
      
      my@lines=map[split];
      

      从文件句柄
      $fh
      读入所有行,并在空白处拆分。第一行的第一个字段是
      $lines[0][0]
      。第一行的第三个字段是
      $lines[0][2]
      等等。

      大多数情况下,编写
      split/[]+/
      的程序员实际上想要
      split'
      我想问另一个问题,非常感谢您的帮助……我如何将几个相同大小的数组更改为一个数组:my@a=([0,0,1,1,0,0],[0,0,0,1,0,1,0], [1,0,0,1,0,0,0], [0,1,1,0,0,0,1], [1,0,0,0,0,1,1], [0,1,0,0,1,0,1], [0,0,0,1,1,1,0] );
      my @pn;
      for my $i ( 0 .. $#p ) {
        $pn[$i] = [ split /[ ]+/, $p[$i] ];
      }
      
      my @lines = map [ split ], <$fh>;