首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >perl hashref/ perl语法

perl hashref/ perl语法
EN

Stack Overflow用户
提问于 2012-06-02 12:35:05
回答 2查看 284关注 0票数 4

今天通过的这个代码的变体(由perl程序员编写),它令人困惑:

代码语言:javascript
复制
   my $k = {3,5,6,8};
   my $y = {%$k};

为什么?这是做什么的?这看起来和下面的是一样的:

代码语言:javascript
复制
   my $y = $k;

上下文在使用dbi模块的调用中:

代码语言:javascript
复制
               while (my $x = $db->fetchrow_hashref )
               {  $y{something} = {%$x};  }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-02 12:41:36

不同之处在于,它是对数据结构进行克隆,而不引用相同的内存。

例如:

代码语言:javascript
复制
use strict;
use warnings;
use Data::Dumper;

my $h={'a'=>1,'b'=>2};
my $exact_copy=$h; #$exact_copy references the same memory as $h
$h->{b}++; #$h maps b to 3

print Dumper($exact_copy) . "\n"; #a=>1,b=>3

my $clone={%$h}; #We dereference $h and then make a new reference
$h->{a}++; #h now maps a to 2

print Dumper($clone) . "\n"; #a=>1,b=>3 so this clone doesn't shadow $h

顺便说一句,通过使用所有逗号来手动初始化散列(就像在my $k = {3,5,6,8}中一样)是非常非常丑陋的。

票数 8
EN

Stack Overflow用户

发布于 2012-06-02 13:03:54

在本例中,{ }是散列构造器。它创建一个新的散列并返回对该散列的引用。所以

比较

代码语言:javascript
复制
my $k = { a => 4 };
my $y = $k;
$k->{a} = 5;
print $y->{a};   # 5

使用

代码语言:javascript
复制
my $k = { a => 4 };
my $y = { %$k };
$k->{a} = 5;
print $y->{a};   # 4
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10859819

复制
相关文章

相似问题

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