gpt4 book ai didi

perl - perl read() 函数和不是 ref 的缓冲区背后的魔法是什么?

转载 作者:行者123 更新时间:2023-12-04 13:55:28 24 4
gpt4 key购买 nike

我不明白 Perl read($buf) 函数如何能够修改 $buf 变量的内容。 $buf 不是引用,所以参数是通过复制给出的(来自我的 c/c++ 知识)。那么如何在调用者中修改 $buf 变量呢?

它是一个领带变量还是什么?关于 setbuf 的 C 文档对我来说也非常难以捉摸和不清楚

# Example 1
$buf=''; # It is a scalar, not a ref
$bytes = $fh->read($buf);
print $buf; # $buf was modified, what is the magic ?

# Example 2
sub read_it {
my $buf = shift;
return $fh->read($buf);
}
my $buf;
$bytes = read_it($buf);
print $buf; # As expected, this scope $buf was not modified

最佳答案

不需要魔法——所有的 perl 子程序都是按别名调用的,如果你愿意的话。报价 perlsub :

The array @_ is a local array, but its elements are aliases for the actual scalar parameters. In particular, if an element $_[0] is updated, the corresponding argument is updated (or an error occurs if it is not updatable).



例如:
sub increment {
$_[0] += 1;
}

my $i = 0;
increment($i); # now $i == 1

在您的“示例 2”中,您的 read_it sub 复制 @_ 的第一个元素到词法 $buf ,然后通过调用 read()“就地”修改该副本。 .传入 $_[0]而不是复制,看看会发生什么:
sub read_this {
$fh->read($_[0]); # will modify caller's variable
}
sub read_that {
$fh->read(shift); # so will this...
}

关于perl - perl read() 函数和不是 ref 的缓冲区背后的魔法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3011653/

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