gpt4 book ai didi

perl - 谁能解释为什么 foreach 有效但 map 无效

转载 作者:行者123 更新时间:2023-12-02 05:27:11 25 4
gpt4 key购买 nike

如果 %hash 中存在键,我尝试将键值对放在 %hash1数组中有一个元素在 %hash 处没有条目例如:@array = (1,2,3,4,5); #在 %hash 处没有 key 1 的哈希条目

所以我认为 map 可以完成这项工作,我将在我的新哈希中获得 4 个键,即 %hash1 但它提供了 5 个键。同时我尝试了 foreach 并且它起作用了。我误以为我们可以使用 map 替换 foreach,但这个案例让我开始思考。谁能解释一下,我的逻辑哪里出了问题?

#Method 1. Comment it while using Method 2
%hash1 = map { $_=>$hash{$_} if(exists $hash{$_}) } @array;

# Method 2. Comment whole loop while using method 1
foreach (@array){
$hash1{$_} = $hash{$_} if(exists $hash{$_});
}

最佳答案

你的问题是你的 map表达式返回 undef @array 中第一个元素的假值. 并且它被字符串化为一个空字符串,因为它被用作哈希键。 (在评论中,Borodin 指出这种解释是不正确的。事实上,空字符串来自 false 值当键为“1”时从 exists 返回)

如果您 a) 打开 strict,您可能会更好地了解正在做什么和 warnings b) 使用 Data::Dumper在创建哈希后显示它。

#!/usr/bin/perl

use strict;
use warnings;
use 5.010;

use Data::Dumper;

my @array = (1 .. 5);
my %hash = ( 2 => 'two', 3 => 'three', 4 => 'four', 5 => 'five' );

my %hash1 = map { $_=>$hash{$_} if(exists $hash{$_}) } @array;

say Dumper \%hash1;

这表明您最终得到了这样的哈希:

$ ./hash 

Odd number of elements in hash assignment at ./hash line 12.
$VAR1 = {
'' => 2,
'three' => 4,
'five' => undef,
'two' => 3,
'four' => 5
};

您正在生成一个包含奇数个元素的列表。这并不是一个快乐的散列。

构建哈希时,您需要确保拥有偶数个元素。所以当你使用 map您需要为每次迭代返回零个或两个元素。所以你需要这样的东西:

#!/usr/bin/perl

use strict;
use warnings;
use 5.010;

use Data::Dumper;

my @array = (1 .. 5);
my %hash = ( 2 => 'two', 3 => 'three', 4 => 'four', 5 => 'five' );

my %hash1 = map { exists $hash{$_} ? ($_ => $hash{$_}) : () } @array;

say Dumper \%hash1;

请注意,当在第一个哈希中找不到键时,我们明确返回一个空列表。

$ ./hash2
$VAR1 = {
'4' => 'four',
'3' => 'three',
'2' => 'two',
'5' => 'five'
};

关于perl - 谁能解释为什么 foreach 有效但 map 无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11467563/

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