神秘化Perl glob(*)

前端之家收集整理的这篇文章主要介绍了神秘化Perl glob(*)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
this question年,海报问如何做到以下一行:
  1. sub my_sub {
  2. my $ref_array = shift;
  3. my @array = @$ref_array;
  4. }

通过我对基本Perl魔法的了解,我将通过简单的使用以下方式避免:

  1. sub my_sub {
  2. my $ref_array = shift;
  3. for (@$ref_array) {
  4. #do somthing with $_ here
  5. };
  6.  
  7. #use $ref_array->[$element] here
  8. }

然而在this answer年,SO的当地僧侣tchrist建议:

  1. sub my_sub {
  2. local *array = shift();
  3. #use @array here
  4. }

当我问

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?谢谢。

解决方法

分配给球
  1. *glob = VALUE

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

这个成语

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

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

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

  1. no strict;
  2.  
  3. sub F {
  4. local *array = shift;
  5.  
  6. print "\@array = @array\n";
  7. print "\$array = $array\n";
  8. print "\%array = ",%array,"\n";
  9. print "------------------\n";
  10. }
  11.  
  12. $array = "original scalar";
  13. %array = ("original" => "hash");
  14. @array = ("orignal","array");
  15.  
  16. $foo = "foo";
  17. @foo = ("foo","bar");
  18. %foo = ("FOO" => "foo");
  19.  
  20. F ["new","array"]; # array reference
  21. F \"new scalar"; # scalar reference
  22. F {"new" => "hash"}; # hash reference
  23. F *foo; # typeglob
  24. F 'foo'; # not a reference,but name of assigned variable
  25. F 'something else'; # not a reference
  26. F (); # undef

输出

  1. @array = new array
  2. $array = original scalar
  3. %array = originalhash
  4. ------------------
  5. @array = orignal array
  6. $array = new scalar
  7. %array = originalhash
  8. ------------------
  9. @array = orignal array
  10. $array = original scalar
  11. %array = newhash
  12. ------------------
  13. @array = foo bar
  14. $array = foo
  15. %array = FOOfoo
  16. ------------------
  17. @array = foo bar
  18. $array = foo
  19. %array = FOOfoo
  20. ------------------
  21. @array =
  22. $array =
  23. %array =
  24. ------------------
  25. @array = orignal array
  26. $array = original scalar
  27. %array = originalhash
  28. ------------------

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

猜你在找的Perl相关文章