gpt4 book ai didi

arrays - Perl 中的二维数组访问

转载 作者:行者123 更新时间:2023-12-01 08:59:08 24 4
gpt4 key购买 nike

我有一个包含城市的数组。我想通过引用子例程来传递数组并打印每个城市以输出。但是,我有以下问题:

  1. 我可以在子例程中的 while 循环之前访问每个元素。但我无法访问我的 while 循环中的元素。我收到错误消息:

    ...在第 44 行、第 997 行 (#1) 的打印中使用未初始化的值在第 44 行、第 998 行打印使用未初始化的值 (#1)...

以下是一些代码。我已经评论了打印的内容和不打印的内容(我试图删掉我的解释不需要的代码......):

@cities;

# Assume cities is loaded successfully
&loadCities(getFileHandle('cities.txt'), $NUM_CITIES, \@cities);
&printElements(getFileHandle('names.txt'), \@cities);

sub printElements{

my $counter = 0;
my $arraySize = scalar $_[1];

# Prints fine!!!
print @{$_[1][($counter)%$arraySize];

while ((my $line = $_[0]->getline()) && $counter < 1000){

# Doesn't print. Generates the above error
print @{$_[1][($counter)%$arraySize];

$counter += 1;
}
}
  1. Perl 语法让我非常困惑。我不明白@{$_[1]}[0] 发生了什么。我正在努力解决。
  1. $_[1],将此位置的值视为标量值(内存数组的地址)
  2. @{...},解释这里存储的内容作为数组的内存地址
  3. @{...} [x],访问索引 x 处的元素

我走对了吗?

最佳答案

我的第一个提示是,您应该将 use strict;use warnings; 放在脚本的顶部。这通常揭示了很多事情。

这一行:print @{$_[1][($counter)%$arraySize]; 没有结束 }。您也不需要 $counter 周围的括号。

正如您提到的,获取数组长度的最佳/最清晰的方法是 my $arraySize = scalar @{$_[1]};


您可以查看文档 here用于引用。我会给你一个快速的概述。

你可以正常声明一个数组

my @array = (1, 2, 3);

然后你可以使用反斜杠来引用它。

my $array_ref = \@array;

如果要使用引用,请使用 @{...}。这就像使用常规数组一样。

print @{$array_ref};

您也可以将其声明为使用方括号开头的引用。

my $array_ref = [1, 2, 3];
print @{$array_ref}; # prints 123

在 Perl 中,二维数组实际上是数组引用的数组。这是一个例子:

my @array = ( ['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i'] );
print @{$array[1]}; # prints def

现在让我们尝试将数组引用传递给子例程。

my @array = ( ['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i'] );

example(\@array); # pass in an array reference

sub example {
my @arr = @{$_[0]}; # use the array reference to assign a new array
print @{$arr[1]};

print @{$_[0][1]}; # using the array reference works too!
}

现在让我们把它放在一起并打印整个二维数组。

my @array = ( ['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i'] );
example(\@array);
sub example {
my @arr = @{$_[0]};
for my $ref (@arr) {
print @{$ref};
}
} # prints abcdefghi

如果你想将这个例子用于你的 printElements 子例程,你可以很容易地修改它。


关于在数组中打印元素的另一个注意事项。让我们从上一个示例中提取这一行:

print @{$ref};

由于我们每次循环都调用它,我们可能想在它的末尾打印一个新行。

print @{$ref} . "\n";

这打印什么?试试看!有用吗?

这是内置子程序join派上用场。

print join(" ", @{$ref}) . "\n";

For 循环通常是遍历数组的最佳方式。我在这里的回答稍微谈到了使用 while 循环:https://stackoverflow.com/a/21950936/2534803你也可以看看这个问题:Best way to iterate through a Perl array

关于arrays - Perl 中的二维数组访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21975109/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com