我从未真正深入地学习过Perl,但我正在通过我的工作完成一门课程(我可以说“只是为了好玩”吗?)我了解基本知识,没有任何重大问题,但现在正在学习参考资料和速记。对于数组的简写和访问引用的值,我有一个疑问,请考虑以下两个脚本:
我的问题是,为什么在第二个示例中,最终打印语句中的$BookPageArray引用需要在其周围加上花括号,而在第一个示例中,$CodeRef引用不需要?
如果我去掉第二个例子中的花括号和前面的$符号,它就会告诉我在该引用中没有任何数组.
第二个例子是使用匿名数据,这与此有关吗?
发布于 2013-11-06 13:48:17
您可以移除卷曲:
$$BookPageArray->[0]."\n";您需要两个$,因为BookPageArray是对数组的引用。因此,第一个'$‘获取对数组的引用,箭头取消这个引用并对数组进行索引。
发布于 2013-11-06 14:48:26
喔,这可是糟糕的代码!我知道这不是你的错。
引用通常是对数组或散列的引用,但是$BookPageArray是对数组引用的引用。这是在炫耀还是打算教你
花括号就像数学表达式周围的圆括号。它们可能有助于澄清或混淆。
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中,括号是必要的。
my $answer = 1 + 3 + 4 + 9 + 10;
my $answer = ( ( ( ( 1 + 3 ) + 4 ) + 9 ) + 10 );再说一遍,这两者是一样的。问题是括号是否澄清了正在发生的事情(它们没有),还是使理解变得更加困难(它们确实如此)。
这些也是同等的:
print $foo . "\n";
print ${foo} . "\n";在某些情况下,花括号会有所帮助:
print "The file name is ${foo}_bar.txt\n";在这里,您需要大括号,以便让Perl知道变量是$foo而不是$foo_bar。这些措施相当于:
print "The file name is ${foo_bar}.txt\n";
print "The file name is $foo_bar.txt\n";所以,在你的声明中:
${$BookPageArray}->[0]."\n";有些人喜欢这个,因为它有助于强调${BookPageArray}是一个标量引用,并帮助您看到这个引用被取消引用:
${$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!当您取消引用数组和散列时,箭头->语法可以帮助澄清问题。
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.这些都是等同的,但第一个是最容易理解的。不幸的是,没有->等效于取消引用标量。幸运的是,这并不是经常发生的事情。
大多数情况下,引用只是为了创建复杂的数据结构:
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";
发布于 2013-11-06 14:31:27
请注意,
print @{@{@{$CodeRef}[0]}[1]}[1], "\n"; # Array slices应该是
print ${${${$CodeRef}[0]}[1]}[1], "\n"; # Array lookups by index你也可以在这里使用数组符号。
print $CodeRef->[0]->[1]->[1], "\n";那就简化成
print $CodeRef->[0][1][1], "\n";注意这张桌子中的相似之处。
https://stackoverflow.com/questions/19813630
复制相似问题