【问题标题】:Why does my Perl print show HASH(0x100a2d018)?为什么我的 Perl 打印显示 HASH(0x100a2d018)?
【发布时间】:2009-09-27 03:23:11
【问题描述】:

我想我知道如何在 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)

看起来我正在打印第二个字符串的地址。如何获取存储在列表中的实际字符串?我认为它与参考有关,但不确定。

【问题讨论】:

    标签: perl string list reference


    【解决方案1】:
    my @list = { $temp1, $temp2 };
    

    应该是

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

    您的原始代码所做的是将对哈希 {$temp1 => $temp2} 的引用存储到 @list 的第一个元素 ($list[0]) 中。这是一件非常有效的事情(这就是您没有收到语法错误的原因),但这不是您打算做的。

    【讨论】:

    • 天哪,这比我想象的要愚蠢。口译员没有抱怨我的语法差。当我使用大括号而不是括号时它在做什么?
    • @Jergason:{} 创建一个匿名哈希并返回对它的引用。你的语法很完美,只是没有做你想做的事。
    • 这就是你为 Perl 的表达能力付出的代价……没有严格的类型检查。我更喜欢 Perl,但必须小心这样的小细节,因为解释器不太可能认为它不值得成为有效的 Perl :)
    【解决方案2】:

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

    但是,仍然存在您不知道您提出的问题的问题。

    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 在大多数情况下都会发生 - 大多数时候正确的事情会发生,而不必担心细节。

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

    【讨论】:

      猜你喜欢
      • 2015-12-17
      • 1970-01-01
      • 1970-01-01
      • 2011-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多