gpt4 book ai didi

perl - 匿名哈希中的奇数个元素

转载 作者:行者123 更新时间:2023-12-04 00:22:17 25 4
gpt4 key购买 nike

我试图理解这个 Perl 代码......

如果有一个流,它可以工作,如果有 2 个或更多流,它会用匿名哈希中的奇数个元素发出警告。在这种情况下,它似乎返回一个数组。如何将数组元素正确添加到@streams?它似乎在 if 子句中为 HASH 情况正确添加。 else 子句是废话吗?

 my $x = $viewedProjectDataObj->{streams};

if (ref($x) eq 'HASH') {
push(@streams, $x->{id});
} elsif (ref($x) eq 'ARRAY') {

print "$x\n";
print "@$x\n";
my @array = @$x;
foreach my $obj (@array) {
print "in $obj\n";
print Dumper( $obj);
push(@streams, ($obj->{id}) );
}
}

print "streamcount " . @streams % 2;
print Dumper(@streams);


my $stream_defect_filter_spec = {
'streamIdList' => @streams,
'includeDefectInstances' => 'true',
'includeHistory' => 'true',
};

my @streamDefects = $WS->get_stream_defects($defectProxy, \@cids, $stream_defect_filter_spec);
print Dumper(@streamDefects);

我正在添加下一行...
if ($defectSummary->{owner} eq "Various") {
foreach (@streamDefects) {
if (exists($_->{owner})) {
$defectSummary->{owner} = $_->{owner};
last;
}
}
}

my $diref = $streamDefects[0]->{defectInstances};
if ($diref) {
my $defectInstance;
if (ref($diref) eq 'HASH') {
$defectInstance = $diref;
} elsif (ref($diref) eq 'ARRAY') {
$defectInstance = @{$diref}[0];
} else {
die "Unable to handle $diref (".ref($diref).")";
}

它现在错误

Web API 返回错误代码 S:Server:调用 getStreamDefects:未找到流
对于名称为空。
$VAR1 = -1;

在 xyz-handler.pl 第 317 行使用“严格引用”时,不能使用字符串(“-1”)作为 HASH 引用。

一些 Dumper 输出
$VAR1 = {
'streamIdList' => [
{
'name' => 'asdfasdfadsfasdfa'
},
{
'name' => 'cpp-62bad47d63cfb25e76b29a4801c61d8d'

}
],
'includeDefectInstances' => 'true',
'includeHistory' => 'true'
};

最佳答案

分配给散列的列表是一组键/值对,这就是元素数量必须是偶数的原因。

因为=>运算符只不过是一个逗号,而 @streams数组在列表中被展平,这

my $stream_defect_filter_spec = {
'streamIdList' => @streams,
'includeDefectInstances' => 'true',
'includeHistory' => 'true',
};

相当于这个
my $stream_defect_filter_spec = {
'streamIdList' => $streams[0],
$streams[1] => $streams[2],
$streams[3] => $streams[4],
...
'includeDefectInstances' => 'true',
'includeHistory' => 'true',
};

所以我希望你能看到如果数组中有偶数个元素,你会收到警告。

要解决问题,您需要将哈希元素的值作为数组引用,这是一个标量并且不会破坏事物的方案
my $stream_defect_filter_spec = {
'streamIdList' => \@streams,
'includeDefectInstances' => 'true',
'includeHistory' => 'true',
};

这样你就可以访问数组元素
$stream_defect_filter_spec->{streamIdList}[0]

等等。

顺便说一句,您可以通过让 map 来大幅整理您的代码。做它擅长的事情:
if (ref $x eq 'HASH') {
push @streams, $x->{id};
}
elsif (ref $x eq 'ARRAY') {
push @streams, map $_->{id}, @$x;
}

关于perl - 匿名哈希中的奇数个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11595011/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com