首页
学习
活动
专区
圈层
工具
发布

Perl速记
EN

Stack Overflow用户
提问于 2013-11-06 13:40:29
回答 4查看 313关注 0票数 4

我从未真正深入地学习过Perl,但我正在通过我的工作完成一门课程(我可以说“只是为了好玩”吗?)我了解基本知识,没有任何重大问题,但现在正在学习参考资料和速记。对于数组的简写和访问引用的值,我有一个疑问,请考虑以下两个脚本:

  1. @Codes =( ["A1W“、"A2Q”、"A2Z"]、"B2R“、"BB3”);$CodeRef = \@Codes;#完整符号打印@{{@{{$CodeRef}1}1}1、"\n";#简写符号打印$CodeRef->>1->1、“n”;
  2. 我的$BookPageArray;{ $AnotherArray = 24,18,36;$Reference = \ $AnotherArray;$BookPageArray = \$AnotherArray;$AnotherArray= 53,256,42;计数下降到0} undef $Reference;打印${$BookPageArray}->。

我的问题是,为什么在第二个示例中,最终打印语句中的$BookPageArray引用需要在其周围加上花括号,而在第一个示例中,$CodeRef引用不需要?

如果我去掉第二个例子中的花括号和前面的$符号,它就会告诉我在该引用中没有任何数组.

第二个例子是使用匿名数据,这与此有关吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-11-06 13:48:17

您可以移除卷曲:

代码语言:javascript
复制
$$BookPageArray->[0]."\n";

您需要两个$,因为BookPageArray是对数组的引用。因此,第一个'$‘获取对数组的引用,箭头取消这个引用并对数组进行索引。

票数 5
EN

Stack Overflow用户

发布于 2013-11-06 14:48:26

喔,这可是糟糕的代码!我知道这不是你的错。

引用通常是对数组或散列的引用,但是$BookPageArray是对数组引用的引用。这是在炫耀还是打算教你

花括号就像数学表达式周围的圆括号。它们可能有助于澄清或混淆。

代码语言:javascript
复制
my $answer = 3 + 4 x 5 + 6;          # Example 1
my $answer = 3 + ( 4 x 5 ) + 6;      # Example 2
my $answer = ( 3 + 4 ) X ( 5 + 6 );  # Example 3

示例1和示例2是相同的。括号说明了吗?你可以说他们有。在示例3中,括号是必要的。

代码语言:javascript
复制
my $answer = 1 + 3 + 4 + 9 + 10;
my $answer = ( ( ( ( 1 + 3 ) + 4 ) + 9 ) + 10 );

再说一遍,这两者是一样的。问题是括号是否澄清了正在发生的事情(它们没有),还是使理解变得更加困难(它们确实如此)。

这些也是同等的:

代码语言:javascript
复制
print $foo . "\n";
print ${foo} . "\n";

在某些情况下,花括号会有所帮助:

代码语言:javascript
复制
print "The file name is ${foo}_bar.txt\n";

在这里,您需要大括号,以便让Perl知道变量是$foo而不是$foo_bar。这些措施相当于:

代码语言:javascript
复制
print "The file name is ${foo_bar}.txt\n";
print "The file name is $foo_bar.txt\n";

所以,在你的声明中:

代码语言:javascript
复制
${$BookPageArray}->[0]."\n";

有些人喜欢这个,因为它有助于强调${BookPageArray}是一个标量引用,并帮助您看到这个引用被取消引用:

代码语言:javascript
复制
${$BookPageArray}->[0]."\n";   # I see that this is a scalar reference being dereferenced
$$BookPageArray->[0]."\n";     # Didn't notice the `$$`, so missed the dereferencing.
${${$BookPageArray}}[0]."\n";  # Yes, this is the same thing!

当您取消引用数组和散列时,箭头->语法可以帮助澄清问题。

代码语言:javascript
复制
my $value = $foo->{BAR};    # I can see that `$foo` is a reference to an array!
my $value = ${${foo}}{BAR}; # Ow! This hurts my brain
my $value = $$foo{BAR};     # Easier on the brain, but I'll miss that `$foo` is a ref.

这些都是等同的,但第一个是最容易理解的。不幸的是,没有->等效于取消引用标量。幸运的是,这并不是经常发生的事情。

大多数情况下,引用只是为了创建复杂的数据结构:

代码语言:javascript
复制
my $person = {};  # This will be a hash reference (not necessary)...
$person->{NAME} = "Bob";
$person->{ADDR} = "123 Testing Ave.";
$person->{CITY} = "New York";
$person->{STATE} = "CA"; #Got you!
$person->{PHONE} = [];  # Array Reference (not necessary)
$person->{PHONE}->[0] = {}; # Hash reference (not necessary)
$person->{PHONE}->[0]->{TYPE} = "cell";
$person->{PHONE}->[0]->{NUMBER} = "555-1234";

你可以看到在这个结构中,我有一个人的名字,地址,和多个电话号码。

我不需要声明某物为数组引用或散列引用,但它有时可以澄清您正在存储的内容。没有必要使用my $person = {};。我本可以只做my $person,但这有助于澄清它是您正在使用的引用。为电话号码声明数组引用可能会增加更多的烟而不是光,因此不应该这样做。将$person->{PHONE}->[0]声明为散列引用实际上只是减少了正在发生的事情。

我建议使用内置的Perl参考教程。它是直截了当的,容易理解。我还建议您阅读一本关于现代Perl的好书,因为Perl的编码风格和语法在Perl3.x之后发生了变化,许多Perl书籍似乎都是基于这种风格和语法的。

在您熟悉了引用之后,您应该阅读面向对象Perl教程。面向对象的Perl基本上是使用引用来创建复杂的数据结构,但是这样做可以轻松地跟踪复杂的结构。

跟踪这样的事情变得有点复杂:$person->{PHONE}->[0]->{NUMBER} = "555-1234";

票数 10
EN

Stack Overflow用户

发布于 2013-11-06 14:31:27

请注意,

代码语言:javascript
复制
print @{@{@{$CodeRef}[0]}[1]}[1], "\n";  # Array slices

应该是

代码语言:javascript
复制
print ${${${$CodeRef}[0]}[1]}[1], "\n";  # Array lookups by index

你也可以在这里使用数组符号。

代码语言:javascript
复制
print $CodeRef->[0]->[1]->[1], "\n";

那就简化成

代码语言:javascript
复制
print $CodeRef->[0][1][1], "\n";

注意这张桌子中的相似之处。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19813630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档