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

jer*_*son 3 string perl reference list

在这里,我想我知道如何在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)
Run Code Online (Sandbox Code Playgroud)

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

DVK*_*DVK 10

my @list = { $temp1, $temp2 };
Run Code Online (Sandbox Code Playgroud)

应该

my @list = ( $temp1, $temp2 ); # Parentheses instead of curly braces.
Run Code Online (Sandbox Code Playgroud)

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

  • @Jergason:{}创建一个匿名哈希并返回对它的引用.你的语法很完美,只是不做你想要的. (4认同)

dao*_*oad 8

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

但是,你问的问题仍然是你不知道的问题.

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

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

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

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

说什么?

好的,顺便提一下my $foo = (1,2,3).这$foo是一个标量,因此表达式(1,2,3)在标量上下文中进行评估.

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

它是使用逗号运算符串联在一起的一组文字值.在一个标量上下文中,逗号运算符返回右边的值,所以我们真的((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.请注意,list_ofPerl中没有运算符,我试图区分通常被认为是文字列表和实际列表的内容.由于无法在Perl中直接表达实际列表,因此我必须完成一个.

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

  • 了解并关注背景.
  • 请记住,您的数组变量是数组而不是列表.
  • 如果这些东西看起来令人困惑,请不要太担心.
  • 大多数情况下,DWIM确实会在不担心细节的情况下发生正确的事情.

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