gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 19:38:16 25 4
gpt4 key购买 nike

作为一个新手,我正在尝试使用来自 atlanta perl mongers 的 Material 探索 perl 数据结构,可在此处获得 Perl Data Structures

这是我编写的示例代码,01.pl02.pl 相同,但 01.pl 包含额外的两个编译指示: use strict;使用警告;.

#!/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);

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

第一第 44 页提到这两种语法结构: "$$href{'name'}""$$aref[0]" 永远不应该用于访问值。为什么 ?似乎在我的代码中它们工作正常(见下文),而且 perl 提示使用 @{$aref}->[0] 已弃用,所以哪个是正确的?

第二第 45 页提到没有 "use strict" 和使用 "$href{'SomeKey'}" when "$href->{'SomeKey'}" 应该使用,%href 是隐式创建的。所以如果我理解得很好,下面的两个脚本都应该打印“Exists”

    [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'};'

但是第二个不会,为什么?

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

[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

最佳答案

很多人认为 $$aref[0] 很丑,而 $aref->[0] 不丑。其他人不同意;前一种形式没有问题。

另一方面,

@{$aref}->[0] 是一个错误,碰巧有效,但已被弃用,可能不会继续。

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

一个包变量 %href 是通过简单地提及这样的散列来创建的,而没有 use strict "vars" 生效,例如通过留下 -> 来自 $href->{'SomeKey'}。这并不意味着创建了特定的 key 。

更新:查看 Perl Best Practices 引用(这本书激发了更多的盲目采用和比作者预期的更少的实际想法),它特别推荐 -> 形式以避免这种可能性留下印记,导致第45页提到的问题。

关于Perl - 关于解引用的正确语法的两个问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14309155/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com