加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

神秘化Perl glob(*)

发布时间:2020-12-15 21:18:23 所属栏目:大数据 来源:网络整理
导读:在 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 wi
在 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 = VALUE

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

这个成语

local *array = shift();
#use @array here

当子例程的第一个参数是数组引用时,可以作为文档。如果第一个参数是相反的,比如说一个标量引用,那么只有$ array而不是@array会受到赋值的影响。

一个小的演示脚本来看看发生了什么:

no strict;

sub F {
  local *array = shift;

  print "@array = @arrayn";
  print "$array = $arrayn";
  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 = 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
------------------

perlmodperldata的附加文档。在引用之前的日子里,Perl的一部分,这个成语有助于传递数组和散列成子程序。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读