0

数组@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; 
...
...

等等。

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

4

2 回答 2

4

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

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

假设你有一个更好的名字@p,比如说@lines。然后你可以写

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

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

于 2013-05-21T10:50:52.187 回答
3

首先,语法使用hash 中@p{$i}的键访问条目,并在列表上下文中返回它。我不认为你是那个意思。收到有关未声明变量的警告。$i%puse 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] ];
}

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

于 2013-05-21T10:50:12.970 回答