Arrays Perl:删除散列中不带';t作为数组中的元素存在

Arrays Perl:删除散列中不带';t作为数组中的元素存在,arrays,perl,hash,key,Arrays,Perl,Hash,Key,我有一个密钥名称数组,需要从哈希中删除不在此列表中的任何密钥 我认为在散列中迭代时删除密钥是一件坏事,但它似乎确实有效: 使用严格; 使用警告; 使用数据::转储程序; my@array=('item1','item3'); 我的%hash=(item1=>'测试1',item2=>'测试2',items3=>'测试3',item4=>'测试4'); 打印(转储程序(\%hash)); foreach(键%hash) { 删除$hash{$},除非${~@array; } 打印(转储程序

我有一个密钥名称数组,需要从哈希中删除不在此列表中的任何密钥

我认为在散列中迭代时删除密钥是一件坏事,但它似乎确实有效:

使用严格;
使用警告;
使用数据::转储程序;
my@array=('item1','item3');
我的%hash=(item1=>'测试1',item2=>'测试2',items3=>'测试3',item4=>'测试4');
打印(转储程序(\%hash));
foreach(键%hash)
{
删除$hash{$},除非${~@array;
}    
打印(转储程序(\%hash));
给出输出:

$VAR1 = {
      'item3' => 'test 3',
      'item1' => 'test 1',
      'item2' => 'test 2',
      'item4' => 'test 4'
    };
$VAR1 = {
      'item3' => 'test 3',
      'item1' => 'test 1'
    };
有人能给我解释一下更好/更干净/更安全的方法吗


非常感谢。

不要使用smartmatch
~
,它已经从根本上被破坏了,可能会在即将发布的Perl版本中被删除或进行重大更改

最简单的解决方案是构建一个只包含您感兴趣的元素的新哈希:

my %old_hash = (
    item1 => 'test 1',
    item2 => 'test 2',
    item3 => 'test 3',
    item4 => 'test 4',
);
my @keys = qw/item1 item3/;

my %new_hash;
@new_hash{@keys} = @old_hash{@keys};  # this uses a "hash slice"
如果要更新原始哈希,请在之后执行
%old\u hash=%new\u hash
。如果不想使用另一个哈希,您可能希望
使用List::MoreUtils qw/zip/

# Unfortunately, "zip" uses an idiotic "prototype", which we override
# by calling it like "&zip(...)"
%hash = &zip(\@keys, [@hash{@keys}]);
这也有同样的效果

%hash = %hash{@array}

正文必须至少包含30个字符;你输入了21。 无法提交您的答案。请查看上面的错误


有没有办法不用临时散列来保存切片??