如何仅切片定义的值?

Eug*_*kov 5 perl perl-data-structures

我可以将 kes/values 切片如下:

$item->%{ @cols }
Run Code Online (Sandbox Code Playgroud)

但是如果某个列不存在,$item它将在生成的散列中创建。

我可以只切片定义的值吗?

Geo*_*dis 7

您可以检查它们是否存在。

$item->%{ grep {exists $item->{$_}} @cols }
Run Code Online (Sandbox Code Playgroud)

应该只对现有值进行切片。

无论如何 - 简单地访问这些值不应该自动激活它们。只有当您将这些值作为参数传递给某个函数并且它们在那里隐式别名时,它们才会自动激活。

use strict;
use warnings;
use Data::Dumper;

my @cols =qw (a b c);
my $item = [{a => 1, c => 3}];

print Dumper({$item->[0]->%{ grep {exists $item->[0]->{$_}} @cols }});
print Dumper($item);

print Dumper({$item->[0]->%{ @cols }});
print Dumper($item);

print Dumper($item->[0]->%{ grep {exists $item->[0]->{$_}} @cols });
print Dumper($item);

print Dumper($item->[0]->%{ @cols }); ## Only here does autovivication take place
print Dumper($item);
Run Code Online (Sandbox Code Playgroud)

只有最后一次打印将生成:

$VAR1 = [
          {
            'c' => 3,
            'a' => 1,
            'b' => undef
          }
        ];
Run Code Online (Sandbox Code Playgroud)

表明 b 被自动激活。