为什么我的Perl打印显示HASH(0x100a2d018)?

时间:2009-09-27 03:23:12

标签: perl string list reference

这里我想我知道如何在Perl中使用列表,当发生这种情况时。如果我这样做(调试代码,不包括漂亮):

#! /usr/bin/perl -w
use strict;

my $temp1 = "FOOBAR";
my $temp2 = "BARFOO!";

my @list = { $temp1, $temp2 };

print $temp1; #this works fine
print $list[0]; #this prints out HASH(0x100a2d018)

看起来我打印出第二个字符串的地址。如何获取列表中存储的实际字符串?我认为它与引用有关,但dunno肯定。

2 个答案:

答案 0 :(得分:10)

my @list = { $temp1, $temp2 };

应该是

my @list = ( $temp1, $temp2 ); # Parentheses instead of curly braces.

您的原始代码所执行的操作是将对哈希{$temp1 => $temp2}的引用存储到@list的第一个元素($list[0])中。这是一个非常有效的事情(这就是为什么你没有得到语法错误),这不是你想要做的。

答案 1 :(得分:8)

您已经得到了问题的答案,请不要使用{},因为这会创建一个匿名哈希引用。

然而,你问的问题仍然是你不知道的问题。

数组和Perl中的列表有什么区别?

在您的问题中,您使用术语“列表”,就好像它可以与术语数组互换一样,但这些术语不可互换。了解差异是很重要的。

数组是一种变量。您可以为其指定值。你可以参考它。

列表是在列表上下文中计算表达式时创建的零个或多个标量的有序组。

说什么?

好的,请注意my $foo = (1,2,3)的情况。这里$foo是标量,因此在标量上下文中计算表达式(1,2,3)

从表面上看,很容易看到(1,2,3),并说这是一个文字列表。但事实并非如此。

这是一组使用comma operator串联在一起的文字值。在标量上下文中,逗号运算符返回右手值,因此我们确实((1 ,2),3)变为((2),3),最后变为3

现在my @foo = (1,2,3)非常不同。在列表上下文中进行数组赋值,因此我们在列表上下文中评估(1,2,3)。这里逗号运算符将两边都插入列表中。因此,我们将((1,2),3)评估为(list_of(1,2),3),然后评估为list_of(list_of(1,2),3),因为Perl会对列表进行展平,因此会变为list_of(1,2,3)。结果列表将分配到@foo。请注意,Perl中没有list_of运算符,我试图区分通常被认为是文字列表和实际列表的内容。由于无法在Perl中直接表达实际列表,因此我必须完成一个。

那么,这对于刚刚学习Perl的人来说意味着什么呢?我将把它归结为几个关键点:

  • 了解并关注背景
  • 请记住,您的数组变量是数组而不是列表。
  • 如果this stuff seems confusing,请不要太担心。
  • 大多数情况下,DWIM会在不担心细节的情况下发生正确的事情。

在考虑上下文问题时,您可能需要查看以下链接: