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;
...
...
等等。
但是上面的代码不起作用,我怎么能这样做?
答案 0 :(得分:4)
动态生成变量名称是一个坏主意。
我建议这里最好的解决方案是将@p
数组中的每一行转换为字段数组。
假设@p
有一个更好的名称,比如说@lines
。然后你可以写
my @lines = map [ split ], <$fh>;
读入文件句柄$fh
中的所有行并将其拆分为空格。然后第一行的第一个字段是$lines[0][0]
。第一行的第三个字段是$lines[0][2]
等。
答案 1 :(得分:3)
首先,语法@p{$i}
在哈希$i
中访问带有键%p
的条目,并在列表上下文中返回它。我不认为你的意思。 use strict; use warnings;
警告未申报的变量。
您可以使用my
声明变量,例如my @p;
或my $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;
或
my @pn;
for my $i ( 0 .. $#p ) {
$pn[$i] = [ split /[ ]+/, $p[$i] ];
}
要了解有关参考资料的更多信息,请阅读