Arrays 使用perl array_diff实用程序的两个数组之间的差异

Arrays 使用perl array_diff实用程序的两个数组之间的差异,arrays,perl,hash,diff,array-difference,Arrays,Perl,Hash,Diff,Array Difference,我正在尝试在2个阵列上运行array_diff sub array_diff(\@\@) { my %e = map { $_ => undef } @{$_[1]}; return @{[ ( grep { (exists $e{$_}) ? ( delete $e{$_} ) : ( 1 ) } @{ $_[0] } ), keys %e ] }; } my $col = 'col'; my $stg = 'stg'; my @

我正在尝试在2个阵列上运行array_diff

sub array_diff(\@\@) {
    my %e = map { $_ => undef } @{$_[1]};
    return @{[
        ( grep { (exists $e{$_}) ? ( delete $e{$_} ) : ( 1 ) } @{ $_[0] } ),
        keys %e
    ] };
}

my $col = 'col';
my $stg = 'stg';
my @blocks = qw( block1 block2 block3 block4 block5 );
my %hash; @{$hash{$col}{$stg}} = qw( block1 block2 block3 );

my @diff = array_diff(@all_blocks, @{$hash{$col}{$stg}});
print ("diff : @diff\n");
当执行上述行时,它给出以下错误:

get_blocks.pl第56行的字符串中可能存在@diff的非预期内插。 main::array_diff的arg 2类型必须是get_blocks.pl第55行附近的数组非引用构造函数} get_blocks.pl第55行附近的语法错误} 由于编译错误,get_blocks.pl的执行被中止。 然而,当我在没有散列数组的情况下尝试相同的方法时,它是有效的

my @a = qw( a b c d e);
my @b = qw( c d  );

sub array_diff(\@\@) {
    my %e = map { $_ => undef } @{$_[1]};
    return @{[
        ( grep { (exists $e{$_}) ? ( delete $e{$_} ) : ( 1 ) } @{ $_[0] } ),
        keys %e
    ] };
}
# symmetric difference
my @diff = array_diff(@a, @b);
print ("diff : @diff\n");
结果:

差异:a b e 我们可以咨询以找出错误和警告

get_blocks.pl第56行的字符串中可能存在@diff的非预期内插

您在双引号字符串中说了类似于“@foo”的内容,但当时范围中没有数组@foo。如果你想要一个字面上的@foo,那么就把它写成\@foo;否则,请找出您显然不知道的阵列发生了什么

您正在执行@diff,但未声明@diff

main::array_diff的arg 2类型必须是get_blocks.pl第55行附近的数组非引用构造函数}

F此函数要求该位置的参数为某种类型。数组必须是@NAME或@EXPR}。哈希值必须是%NAME或%{EXPR}。不允许隐式解引用将{EXPR}表单用作显式解引用。见perlref

正如上面所说,\@原型必须采用数组,而不是引用

# Bad
array_diff([1,2,3], [4,5,6]);

# Good
array_diff(@{[1,2,3]}, @{[4,5,6]});
您的示例代码和错误不匹配@声明了diff,您已取消引用$hash{$col}{$stg}

我建议不要使用原型。它们不像用其他语言声明函数的参数。相反,它们用于模拟内置函数的神奇行为

相反,请传入引用

my @diff = array_diff(\@all_blocks, $hash{$col}{$stg});
不幸的是,它们仍处于实验阶段


没有必要和格雷普在一起。grep已经返回了一个新数组,不需要克隆它。这会使代码复杂化并浪费内存。

我绝对支持Schwern的话,以消除原型和{[…]}。还要注意如何处理错误。此外,还有非常好的库处理数组之间的关系。现在,我认为自己开发一个库是很好的,但是将它与一个用于接口、错误检查、性能、功能的好库进行比较……提示:return@{[…]}是一种奇怪的返回方式。。。;好吧,它们在标量上下文中的行为可能不同,但在本例中并非如此,因为grep返回标量上下文中匹配元素的数量。您发布的代码没有显示您声称的行为。请修正你的问题