$a = {b=>{c=>1}}; # set up ref
$b = $a->{b}; # ref the ref
$b .= (d=>1,e=>1); # where we want to assign multiple key/val at once
Run Code Online (Sandbox Code Playgroud)
它的结尾$a
应该是这样的:
{
'b' => {
'c' => 1,
'd' => 1,
'e' => 1
}
};
Run Code Online (Sandbox Code Playgroud)它的结尾$b
应该是这样的:
{
'c' => 1,
'd' => 1,
'e' => 1
}
Run Code Online (Sandbox Code Playgroud)注意:它与执行操作相同:
$b->{d} = 1;
$b->{e} = 1;
Run Code Online (Sandbox Code Playgroud)
$b = { %$b, d=>1, e=>1 };
不是所希望的,因为它会创建一个副本$a
并丢失引用.
我有一个Perl类/模块,我创建它来显示圣经经文.其中有一个存储多个经文的哈希,其中键是书/章/诗,而值是文本.此哈希值从模块返回.
我将圣经类包含在控制器类中,并且该连接似乎有效.问题是我在执行时遇到错误.我的IDE是因为我正在使用Lynda教程,Eclipse是带有EPIC插件的.
错误是:
Reference found where even-sized list expected at C:/Documents and Settings/nunya/eric.hepperle_codebase/lynda/lamp/perl5/Exercise Files/14 Modules/eh_bibleInspiration_controller.pl line 42.
Use of uninitialized value $value in concatenation (.) or string at C:/Documents and Settings/nunya/eric.hepperle_codebase/lynda/lamp/perl5/Exercise Files/14 Modules/eh_bibleInspiration_controller.pl line 45.
HASH(0x19ad454) =>
Run Code Online (Sandbox Code Playgroud)
这是CONTROLLER类:
#!/usr/bin/perl
# eh_bibleInspiration_controller.pl by Eric Hepperle - 06/23/13
#
use strict;
use warnings;
use Data::Dumper;
use EHW_BibleInspiration;
main(@ARGV);
sub main
{
my $o = EHW_BibleInspiration->new; # instantiate new object.
my %bo_ref = $o->getBibleObj();
print "\$o is type: " . ref($o) . ".\n"; …
Run Code Online (Sandbox Code Playgroud) 目前,当我想构建一个查找表时,我使用:
my $has_field = {};
map { $has_field->{$_} = 1 } @fields;
Run Code Online (Sandbox Code Playgroud)
有没有办法可以在一个步骤中进行内联初始化?(即在我宣布它的同时填充它?)
我有一个复合hashref如下
my $ch = {
k1 => [ { k=>1 }, { m=>2 } ],
k2 => [ { l=>90}, ... ],
};
Run Code Online (Sandbox Code Playgroud)
Hash::Util::lock_hashref_recurse($ch)
没有有效锁定这些值..
@{$ch->{k1}}[0]->{k} = 'New value';
被允许 !我如何完全锁定这样的hashref?
假设$my_ref = \$hash{'mary'};
#my_ref
是哈希元素的参考点.
....
稍后,我如何使用它$my_ref
来检索它指向的哈希元素的键?即如何从中获取字符串'mary' $my_ref
?
我问这个问题是因为我有几组用户名列表,一些用户名出现在多个消耗内存的组中.所以我决定创建一个通用的用户名列表,让这些组只存储对相应用户名的引用而不是用户名.
最初,
%group1 = {'mary'=>1, 'luke'=1,'tom'=1,...}
%group2 = {'mary'=>1, 'sam'=1,'tom'=1,...}
Run Code Online (Sandbox Code Playgroud)
在这里你看到'mary'和'tom'都显示在两者中group1
并group2
消耗内存.(注意我不关心这个例子中的值,这里的值只是因为数据结构是一个哈希值).所以为了减少内存,我希望有一个公共列表存储所有用户名:
%common_hash = {'mary'=>1, 'luke'=1,'tom'=1,'sam'=1...};
$ref1 = \$common_hash{'mary'};
$ref2 = \$common_hash{'luke'};
$ref3 = \$common_hash{'tom'};
$ref4 = \$common_hash{'sam'};
Run Code Online (Sandbox Code Playgroud)
组仅存储哈希元素的引用:
%group1 = {$ref1=>1, $ref2=1,$ref3=1,...};
%group2 = {$ref1=>1, $ref4=1,$ref3=1,...};
Run Code Online (Sandbox Code Playgroud)
我认为这种方法可以节省大量内存,因为:
但是如何从组中获取用户名?
如果我使用@my_ref = keys %group1
,我想我会得到'玛丽'的价值,但不是'玛丽'.
$result = $($my_ref[0]);
Run Code Online (Sandbox Code Playgroud) if((scalar keys ($this->{'libraries'}->{$y}->{'cellHash'})) == 0){
Run Code Online (Sandbox Code Playgroud)
这是我得到"引用键的参数类型必须是unblessed hashref或arrayref"错误的行.你能帮我解决这个问题吗?我没有出于明显的原因发布代码.
在我的 Perl 代码中,我最终得到了如下所示的哈希引用。我想从中访问单个元素。我尝试了多种方法,但我无法获取它。
#!/usr/bin/perl
#use strict;
use Data::Dumper;
my %h={'one'=>1,'two'=>2};
print Dumper($h{'one'});
Run Code Online (Sandbox Code Playgroud)
输出
$VAR1 = undef;
Run Code Online (Sandbox Code Playgroud) 如何从 perl 哈希设置标量列表?
use strict;
my $my_hash = { field1=>'val1', field2=>'val2', field3=>'val3', };
my ($field1,$field2,$field3) = %{$my_hash}{qw(field1 field2 field3)};
print "field1=$field1\nfield2=$field2\nfield3=$field3\n";
Run Code Online (Sandbox Code Playgroud) perl -E 'say for map s/(æ|ø|å)/ {qw(æ ae ø oe å aa)}->{$1}/ger, qw(rød gul blå)'
perl -E 'say for map s/(æ|ø|å)/"".{qw(æ ae ø oe å aa)}->{$1}/ger, qw(rød gul blå)'
Run Code Online (Sandbox Code Playgroud)
上面的第一行给了我,syntax error at -e line 1, near "}->"
但第二行给了我roed
,gul
与blaa
预期的一样。这是编译器的弱点,还是有我看不见的某些原因?我测试并在版本5.10、5.22和5.26中获得了此行为。
如何将 Perl hashref 解压缩为多个命名标量变量?
我已经看到它完成了,但似乎无法使其发挥作用。
假设给定的以及to$hashref
的定义,这是我的尝试:$arg1
$arg3
my $hashref = { arg1 => 'val1', arg2 => 'val2', arg3 => 'val3',};
my ($arg1,$arg2,$arg3) = @{%$hashref}[qw(arg1 arg2 arg3)];
Run Code Online (Sandbox Code Playgroud)