gpt4 book ai didi

arrays - 什么时候返回数组或散列,什么时候只返回引用?

转载 作者:行者123 更新时间:2023-12-04 21:57:09 25 4
gpt4 key购买 nike

我对以下内容感到困惑。
有时我会看到这样的例子:

my %hash = get_data();

sub get_data {
my %data = ();
# do processing
return %data;
}

与数组类似。
my @arrays = get_data();

sub get_data {
my @data = ();
# do processing
return @data;
}

我最初认为您不能从仅引用它们的函数返回数组或散列。
所以我不明白有什么区别,我们什么时候应该更喜欢另一个?
是否与垃圾收集或我们选择的数据副本过多有关?

最佳答案

严格来说,您不能从 Perl 子例程返回数组或散列。 Perl 子程序返回列表。列表与数组的相似之处在于它们是值的序列,但它们不是数组。数组是变量。列表是用于传递和返回值、初始化数组和散列等的无名、不可变和 transient 数据结构。它是 somewhat subtle point ,但很重要的一个。

当你写 return @data您没有退回 @data大批;您正在返回它包含的值的列表。同样,return %data返回包含在哈希中的键/值对的列表。这些值可用于初始化另一个数组或散列,这就是您的示例中发生的情况。初始化的数组/散列包含子例程使用的数组/散列的(浅)副本。

要“返回”一个数组或散列,您必须返回对它的引用。例如return \@datareturn \%data .这样做会返回对变量本身的引用。修改它也会影响原始数组,因为它是相同的存储。

sub 应该将数组/哈希作为列表(副本)还是引用返回是一个编程决定。对于总是返回 N 个具有位置意义的值(例如 localtime 内置),返回一个列表是有意义的。对于返回任意大列表的子程序,通常最好返回一个引用,因为它更有效。

子进程甚至可以使用 wantarray 来根据它的调用方式来决定返回什么。 .这让调用者决定他们想要什么。

sub get_data {
my @data;
...
return wantarray ? @data : \@data;
}

my $aref = get_data(); # returns a reference
my @array = get_data(); # returns a list

关于arrays - 什么时候返回数组或散列,什么时候只返回引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25765667/

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