揭开Perl glob的神秘面纱(*)

Joe*_*ger 18 perl glob

这个问题中,海报询问如何在一行中执行以下操作:

sub my_sub {
    my $ref_array = shift;
    my @array = @$ref_array;
}
Run Code Online (Sandbox Code Playgroud)

凭借我对基本Perl魔法的了解,我可以通过简单地使用以下内容来避免:

sub my_sub {
    my $ref_array = shift;
    for (@$ref_array) {
      #do somthing with $_ here
    };

    #use $ref_array->[$element] here
}
Run Code Online (Sandbox Code Playgroud)

然而,在这个答案中,SO的当地僧侣之一提出:

sub my_sub {
  local *array = shift();
  #use @array here
}
Run Code Online (Sandbox Code Playgroud)

当我问

在尝试学习中级Perl魔法时,我可以问一下,你在这里设置什么是什么?您是否将@array的引用设置为已传入的arrayref?你怎么知道你创建@array而不是%array或$ array?我在哪里可以了解有关此*运算符的更多信息(perlop?).谢谢!

有人建议我把它作为一个新帖子,尽管他确实提供了很好的参考.无论如何,这里呢?有人可以解释什么被分配给什么以及如何创建@array而不是%array或$ array?谢谢.

mob*_*mob 23

分配给一个glob

*glob = VALUE
Run Code Online (Sandbox Code Playgroud)

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

这个成语

local *array = shift();
#use @array here
Run Code Online (Sandbox Code Playgroud)

当子例程的第一个参数是数组引用时,记录的工作原理.如果第一个参数是一个标量引用,那么只有$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
Run Code Online (Sandbox Code Playgroud)

输出:

@array = new array
$array = original scalar
%array = originalhash
------------------
@array = orignal array
$array = new scalar
%array = originalhash
------------------
@array = orignal array
$array = original scalar
%array = newhash
------------------
@array = foo bar
$array = foo
%array = FOOfoo
------------------
@array = foo bar
$array = foo
%array = FOOfoo
------------------
@array =
$array =
%array =
------------------
@array = orignal array
$array = original scalar
%array = originalhash
------------------

额外的doc perlmodperldata.在引用是Perl的一部分之前的日子里,这个习惯用法有助于将数组和哈希传递到子例程中.