【问题标题】:How can I create a variable array name in Perl?如何在 Perl 中创建变量数组名?
【发布时间】:2013-05-16 01:39:22
【问题描述】:

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

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

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

我希望结果应该是这样的:

@p0 = $p[0]          first line of array @p goes to array @p0;       
@p1 = $p[1]          second line of array @p goes to array @p1; 
...
...

等等。

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

【问题讨论】:

    标签: arrays perl variables


    【解决方案1】:

    首先,语法@p{$i} 访问哈希%p 中带有键$i 的条目,并在列表上下文中返回它。我不认为你是那个意思。 use strict; use warnings; 收到有关未声明变量的警告。

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

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

    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;
    

    my @pn;
    for my $i ( 0 .. $#p ) {
      $pn[$i] = [ split /[ ]+/, $p[$i] ];
    }
    

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

    【讨论】:

    • 大多数情况下,写split /[ ]+/的程序员实际上想要split ' '
    【解决方案2】:

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

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

    让我们假设你有一个更好的名字来称呼@p,比如@lines。然后就可以写了

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

    从文件句柄$fh 中读取所有行并将它们拆分为空格。那么第一行的第一个字段是$lines[0][0]。第一行的第三个字段是$lines[0][2] 等。

    【讨论】:

    • 我想问另一个问题,非常感谢您的帮助...如何将几个相同大小的数组更改为一个数组,如下所示:my @A = ( [0,0,1 ,0,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] );
    猜你喜欢
    • 2018-11-03
    • 1970-01-01
    • 2019-12-21
    • 2017-02-12
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    相关资源
    最近更新 更多