【问题标题】:Perl : Dereference between @_ and $_Perl:@_ 和 $_ 之间的取消引用
【发布时间】:2012-01-18 12:00:45
【问题描述】:

我对以下代码有疑问:

#!/usr/bin/perl

use strict;
use warnings;

my %dmax=("dad" => "aaa","asd" => "bbb");
my %dmin=("dad" => "ccc","asd" => "ddd");

&foreach_schleife(\%dmax,\%dmin);

sub foreach_schleife {
        my $concat;
        my $i=0;

        foreach my $keys (sort keys %{$_[0]}) {
                while ($_[$i]) {
                        $concat.="$_[$i]{$keys} ";
                        print $_[$i]{$keys}."\n";
                        $i++;
                }
                $i=0;
                $concat="";
        }
}

输出是:

   bbb
   ddd
   aaa
   ccc

我不明白这一点。 通常你必须取消对哈希、数组等的引用。 为什么不在这里?写够了:

$_[$i]{$keys}."\n";

不是这样的:

$$_[$i]{$keys}."\n";

为什么? 是不是跟变量@_/$_的特殊性有关?

【问题讨论】:

  • 如果您对答案感到满意,请按旁边的空心绿色复选标记accept。它给你和你接受答案的人都带来了声誉,通常是一种很好的姿态。

标签: perl variables subroutine dereference


【解决方案1】:

您不必取消引用 $_[0]$_[1] 的原因是,当您的引用位于数组或散列中时,$_[$i]{$keys}$_[$i]->{$keys} 的有效简写符号。

$$_[$i]{$keys} 不起作用,因为它会尝试将特殊变量 $_ 取消引用为标量。正确的语法是%{$_[$i]},但是你必须使用%{$_[$i]}->{$keys},它更冗长。

【讨论】:

    【解决方案2】:

    我的猜测是,因为数组(或哈希,就此而言)只能包含哈希references,所以您的第二次索引操作意味着引用是理解

    我认为开发人员需要更好地记录这一点。

    要查看对*_没有特殊性,可以在循环前试试这个:

    my @a = @_;
    

    在此期间:

    print $a[$i]{$keys}."\n";
    

    我认为主要是如果你只有有一个标量引用作为基础,那么至少需要一个->。所以

    my ( $damxr, $dminr ) = @_;
    

    需要

    $dmaxr->{ $key };
    

    【讨论】:

    • 啊……好吧,这很有道理。谢谢。
    • +1。在我看来,速记符号只对打高尔夫球有用,因为即使对于经验丰富的 Perl 开发人员来说也没有意义。
    • @flesk,你有权发表你的意见。我认为有很多 -> 是过多的噪音,如果你想做的只是索引。
    【解决方案3】:

    @_ 是子程序参数的数组,因此$_[$index] 访问$index 处的元素

    只有当你有引用时,解除引用才是好的,但 @_ 不是一个。

    【讨论】:

    • 好吧@_ 不是参考,但它的元素是。但我认为我的帖子的第二个回复给出了可能的正确答案。
    猜你喜欢
    • 2012-09-04
    • 1970-01-01
    • 2011-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    • 2017-10-23
    相关资源
    最近更新 更多