我需要在哈希中获取某个键的所有值.哈希看起来像这样:
$bean = {
Key1 => {
Key4 => 4,
Key5 => 9,
Key6 => 10,
},
Key2 => {
Key7 => 5,
Key8 => 9,
},
};
Run Code Online (Sandbox Code Playgroud)
我只需要值Key4,Key5并Key6为例子.其余的不是兴趣点.我怎么能得到价值观?
更新:所以我没有%bean我只是添加这样的值$bean:
$bean->{'Key1'}->{'Key4'} = $value;
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助.
这是我正在使用的代码片段:
my %photo_details = (
'black_cat' => (
('size' => '1600x1200', 'position' => -25),
('size' => '1280x1024', 'position' => 25),
('size' => '800x600', 'position' => 0),
),
'race_car' => (
('size' => '1600x1200', 'position' => 10),
('size' => '800x600', 'position' => 5),
),
);
my $photo = 'black_cat';
foreach my $photo_detail ($photo_details{$photo})
{
my $size = $photo_detail{'size'};
my $position = $photo_detail{'position'};
print ("size = $size, position = $position\n");
}
Run Code Online (Sandbox Code Playgroud)
我期待得到的是:
size = 1600x1200,position = -25
size = 1280x1024,position = 25 …
我正在做一个小型数据挖掘项目,其中perl脚本从SQL数据库中获取信息并对其进行解析.数据由几个时间戳组成.我想知道在任何特定日期存在多少特定类型的时间戳.不幸的是,这是我的第一个perl脚本,而且当涉及到哈希和数组时,perl的性质令我感到困惑.
代码段:
my %values=();#A hash of the total values of each type of data of each day.
#The key is the day, and each key stores an array of each of the values I need.
my @proposal;
#[drafted timestamp(0), submitted timestamp(1), attny approved timestamp(2),Organiziation approved timestamp(3), Other approval timestamp(4), Approved Timestamp(5)]
while(@proposal=$sqlresults->fetchrow_array()){
#TODO: check to make sure proposal is valid
#Increment the number of timestamps of each type on each particular date
my $i;
for($i=0;$i<=5;$i++)
$values{$proposal[$i]}[$i]++;
#Update rolling average of …Run Code Online (Sandbox Code Playgroud) 如何将"哈希数组"元素作为数组传递给函数?
比方说,我想将所有$link->{text}数组作为数组传递给sort()函数.
#!/usr/bin/perl
use strict; use warnings;
my $field = <<EOS;
<a href="baboon.html">Baboon</a>
<a href="antelope.html">Antelope</a>
<a href="dog.html">dog</a>
<a href="cat.html">cat</a>
EOS
#/ this comment is to unconfuse the SO syntax highlighter.
my @array_of_links;
while ($field =~ m{<a.*?href="(.*?)".*?>(.*?)</a>}g) {
push @array_of_links, { url => $1, text => $2 };
}
for my $link (@array_of_links) {
print qq("$link->{text}" goes to -> "$link->{url}"\n);
}
Run Code Online (Sandbox Code Playgroud) 我有以下散列结构 $chainStorage{$R1}{$S1}{$C1} = \@A1
$chainStorage = {
'ACB' => {
'E' => {'06' => [100, 200, 95]}
'B' => {'23' => [20, 1000, 05, 30]}
},
'AFG' => {
'C' => { '24' => [18, 23, 2300, 3456]}
},
'HJK' => {
'A' => {'12' => [24, 25, 3200, 5668]}
'D' => {'15' => [168]}
}
};
Run Code Online (Sandbox Code Playgroud)
例如,ACB对应于两个阵列,[100, 200, 95]并[20, 1000, 05, 30]
同时E相应于[100, 200, 95]只.
现在,我需要在数组中添加与第一级键对应的所有元素,例如ACB,一起.
换句话说,在另一个哈希结构中,我想ACB …
我是初学者.我试图在运行时从二进制文件构建一个2d数组.我收到了"内存不足"的错误.我在windows7中使用Perl 5.16.3.我的输入文件大小约为4.2MB.我的系统具有4GB的物理内存,我使用90%的使用率,然后在运行此代码时显示内存不足错误.
我尝试了很多方法来调试它.只有当我将b32减少到b16或更低时,我才能成功运行.即使这样,如果文件大小增加超过4MB,则错误再次出现.我尝试在执行代码时查看任务管理器中的物理内存使用情况,并且不断增加.
我的朋友怀疑这应该是内存泄漏问题.我无法与他的嫌犯弄清楚.我需要帮助解决这个问题.
#!/usr/bin/perl
use strict;
use warnings;
open( DATA, 'debug.bin' ) or die "Unable to open:$!";
binmode DATA;
my ( $data, $n, $i );
my @2dmatrix;
while ( $n = read DATA, $data, 4 ) {
push @2dmatrix, [ split( '', unpack( 'b32', $data ) ) ];
}
print scalar(@2dmatrix);
print "completed reading";
close(DATA);
Run Code Online (Sandbox Code Playgroud)
只是为了明确要求.从2d数组构建中,我需要从列B中的特定模式(11111111000000001111111100000000)对应的列A中提取内容.这需要在文件大小为500Mb的4组列上完成.
perl binaryfiles out-of-memory dynamic-arrays perl-data-structures
基于此答案及其join陈述的最小代码
my @x = qw/10 20 30 40/;
my @y = qw/60 70 8 90 10/;
my @input_list = (@x, @y);
print "Before join @input_list \n";
print join ",", @$_ for @input_list ;
print "After join @input_list \n";
Run Code Online (Sandbox Code Playgroud)
这使
Before join 20 40 60 80 120 140 16 180 20
After join 20 40 60 80 120 140 16 180 20
Run Code Online (Sandbox Code Playgroud)
但在 use strict;
在test4.pl第10行使用"strict refs"时,不能使用字符串("10")作为ARRAY引用.
join在手动中连接单独的数组字符串.这里代码尝试使用@$_数组项的每个hash()显式连接逗号.然而,这似乎正在发生.
为什么这个错误出现在最小代码中?
我目前有以下内容
# $dog, $cat, $rat are all hash refs
my %rethash = ('success' => 'Your Cool');
my %ref ={ 'dog' => $dog, 'cat' => $cat, 'mouse' => $rat,
'chicken' => '' };
my $perlobj = ( \%ref,\%rethash );
Run Code Online (Sandbox Code Playgroud)
当$ perlobj被转储时,这就是结果
$VAR1 = {
'success' => 'Your Cool'
};
Run Code Online (Sandbox Code Playgroud)
但是,当启用警告时,我收到以下消息
Useless use of reference constructor in void context at ..
Run Code Online (Sandbox Code Playgroud)
我意识到使用{}分配%ref的方法存在严重错误,这段代码有什么问题?我似乎无法摆脱这个警告......
编辑:好的我想我发现了什么,
my $perlobj = ( \%ref,\%rethash );
Run Code Online (Sandbox Code Playgroud)
这不会合并但会导致$ perlobj成为%rethash的引用,这在阅读您的回复后很明显.
我知道如果你这样做可能会发生冲突.但是给出了数组的哈希:
my %transform = (
'FF0000' => [qw ( error errors assertion )],
'FFFF00' => [qw ( warning warnings paused )],
'008000' => [qw ( active )],
);
Run Code Online (Sandbox Code Playgroud)
我想把它变成一个搜索并替换正则表达式.
例如
my %colour_map = (
'error' => 'FF0000',
'errors' => 'FF0000',
'assertion' => 'FFFF00',
'warning' => 'FFFF00',
'warnings' => 'FFFF00',
'paused' => 'FFFF00',
'active' => '008000',
);
my $search = join( "|", map {quotemeta} keys %colour_map );
$search = qr/\b($search)\b/;
Run Code Online (Sandbox Code Playgroud)
所以我可以:
while (<$fh>) {
if ( my ($match) = m/$search/i ) …Run Code Online (Sandbox Code Playgroud) 这是我的场景,其中有2个哈希值已从2个JSON文件解码.
我有2个复杂的哈希,
$hash1 = {k1=> { k11 => v1, k12 => v2}, k2 => { k21 => [v1, v2, v3] }}
$hash2 = {k1=> { k11 => v1, k12 => v2}, k2 => { k21 => [v3, v2, v1] }}
Run Code Online (Sandbox Code Playgroud)
我想比较这两个哈希的相等性,并使用Data :: Data的比较和Test :: More的is_deeply.两者都不会忽略数组的顺序.
我想比较忽略键'k21'的数组值的顺序.
我的应用程序从'keys%hash'填充数组,它提供随机顺序.
尝试了Data :: Compare的'ignore_hash_keys',但我的哈希有时可能很复杂而且不想忽略.
键'k21'有时也可以有哈希数组.
$hash3 = {k1=> { k11 => v1}, k2 => { k21 => [{v3 => v31}, {v2 => v22}] }}
Run Code Online (Sandbox Code Playgroud)
如何通过忽略数组顺序来比较这种复杂的哈希值.