Perl - 关于解除引用的正确语法的两个问题

Wak*_*nka 3 syntax perl dereference

作为一个新手,我正在尝试使用atlanta perl mongers的这种材料来探索perl数据结构,这里有可用的Perl数据结构

下面是我writen示例代码,01.pl是一样的02.pl,但01.pl包含了两个额外的编译指示:use strict; use warnings;.

#!/usr/bin/perl

my %name = (name=>"Linus", forename=>"Torvalds");
my @system = qw(Linux FreeBSD Solaris NetBSD);

sub passStructure{
  my ($arg1,$arg2)=@_;

  if (ref($arg1) eq "HASH"){
    &printHash($arg1);
  }
  elsif (ref($arg1) eq "ARRAY"){
    &printArray($arg1);
  }

  if (ref($arg2) eq "HASH"){
    &printHash($arg2);
  }
  elsif (ref($arg2) eq "ARRAY"){
    &printArray($arg2);
  }
}

sub printArray{
  my $aref = $_[0];

  print "@{$aref}\n";
  print "@{$aref}->[0]\n";
  print "$$aref[0]\n";          
  print "$aref->[0]\n";
}

sub printHash{
  my $href = $_[0];

  print "%{$href}\n";
  print "%{$href}->{'name'}\n";
  print "$$href{'name'}\n";
  print "$href->{'name'}\n";
}

&passStructure(\@system,\%name);
Run Code Online (Sandbox Code Playgroud)

我误解了上述文件中提到的几点:

第1 页44提及这两个语法结构:"$$href{'name'}""$$aref[0]"不应该永远被用于访问值.为什么?似乎在我的代码中他们工作正常(见下文),而且perl抱怨使用@{$aref}->[0]as deprecated,那么哪一个是正确的?

第二 页提到,如果不"use strict"使用和"$href{'SomeKey'}"何时"$href->{'SomeKey'}"使用,%href则会产生隐含的影响.因此,如果我理解得很好,以下脚本应该打印"存在"

    [pista@HP-PC temp]$ perl -ale 'my %ref=(SomeKey=>'SomeVal'); print $ref{'SomeKey'}; print "Exists\n" if exists $ref{'SomeKey'};'
    SomeVal
    Exists

    [pista@HP-PC temp]$ perl -ale '                              print $ref{'SomeKey'}; print "Exists\n" if exists $ref{'SomeKey'};'
Run Code Online (Sandbox Code Playgroud)

但第二个不会,为什么?

输出两个开头提到的脚本:

[pista@HP-PC temp]$ perl 01.pl 
Using an array as a reference is deprecated at 01.pl line 32.
Linux FreeBSD Solaris NetBSD
Linux
Linux
Linux
%{HASH(0x1c33ec0)}
%{HASH(0x1c33ec0)}->{'name'}
Linus
Linus
[pista@HP-PC temp]$ perl 02.pl 
Using an array as a reference is deprecated at 02.pl line 32.
Linux FreeBSD Solaris NetBSD
Linux
Linux
Linux
%{HASH(0x774e60)}
%{HASH(0x774e60)}->{'name'}
Linus
Linus
Run Code Online (Sandbox Code Playgroud)

yst*_*sth 5

许多人认为$$aref[0]丑陋$aref->[0]而不丑陋.其他人不同意; 前一种形式没有错.

@{$aref}->[0]另一方面,这是一个错误,恰好工作但被弃用,可能不会继续.

您可能需要阅读http://perlmonks.org/?node=References+quick+reference

包变量%href是简单地通过提这样的散列而不创建use strict "vars"在实际上,通过在离开例如->出来的$href->{'SomeKey'}.这并不意味着创建了特定的密钥.

更新:查看Perl最佳实践参考书(这本书激发了更多的盲目采用并且比作者想要的更少的实际思考),它特别推荐该->表格,以避免遗漏一个印记的可能性,导致上面提到的问题P45.