gpt4 book ai didi

perl - 揭秘 Perl glob (*)

转载 作者:行者123 更新时间:2023-12-03 13:28:33 27 4
gpt4 key购买 nike

this question海报询问如何在一行中执行以下操作:

sub my_sub {
my $ref_array = shift;
my @array = @$ref_array;
}

以我对基本 Perl 魔法的了解,我可以通过简单地使用类似的东西来避免:
sub my_sub {
my $ref_array = shift;
for (@$ref_array) {
#do somthing with $_ here
};

#use $ref_array->[$element] here
}

然而在 this answer SO 的一位本地僧侣 tchrist 建议:
sub my_sub {
local *array = shift();
#use @array here
}

当我问

In trying to learn the mid-level Perl magic, can I ask, what is it that you are setting to what here? Are you setting a reference to @array to the arrayref that has been passed in? How do you know that you create @array and not %array or $array? Where can I learn more about this * operator (perlop?). Thanks!



有人建议我将其作为新帖子提出,尽管他确实提供了很好的引用。无论如何,来了?有人可以解释什么被分配给什么以及如何创建@array而不是%array或$array?谢谢。

最佳答案

分配给 glob

*glob = VALUE

包含一些取决于 VALUE 类型的魔法(即, Scalar::Util::reftype(VALUE) 的返回值)。如果 VALUE是对标量、数组、散列或子例程的引用,则只有符号表中的条目将被覆盖。

这个成语
local *array = shift();
#use @array here

当子例程的第一个参数是数组引用时,按记录工作。如果第一个参数是标量引用,那么只有 $array而不是 @array会受到分配的影响。

一个小演示脚本,看看发生了什么:
no strict;

sub F {
local *array = shift;

print "\@array = @array\n";
print "\$array = $array\n";
print "\%array = ",%array,"\n";
print "------------------\n";
}

$array = "original scalar";
%array = ("original" => "hash");
@array = ("orignal","array");

$foo = "foo";
@foo = ("foo","bar");
%foo = ("FOO" => "foo");

F ["new","array"]; # array reference
F \"new scalar"; # scalar reference
F {"new" => "hash"}; # hash reference
F *foo; # typeglob
F 'foo'; # not a reference, but name of assigned variable
F 'something else'; # not a reference
F (); # undef

输出:

@array = 新数组
$array = 原始标量
%array = 原始哈希
------------------
@array = 原始数组
$array = 新标量
%array = 原始哈希
------------------
@array = 原始数组
$array = 原始标量
%array = 新哈希
------------------
@array = 富吧
$数组 = 富
%array = FOOfoo
------------------
@array = 富吧
$数组 = 富
%array = FOOfoo
------------------
@数组 =
$数组=
%数组=
------------------
@array = 原始数组
$array = 原始标量
%array = 原始哈希
------------------

附加文档 perlmod perldata .在引用成为 Perl 的一部分之前的日子里,这个习惯用法有助于将数组和散列传递到子例程中。

关于perl - 揭秘 Perl glob (*),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4865447/

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