【发布时间】:2017-06-25 01:44:18
【问题描述】:
考虑以下 perl 脚本:
use strict;
use warnings;
use Data::Dumper;
# Expects an array reference and an undef replacement value
sub undef_to_value(\@$) {
my $array_ref = shift(@_);
my $default = shift(@_);
# Map each element in the array referenced by $array_ref to...
# If the element is defined, itself
# Otherwise, the $default value
return map {
defined($_) ? $_ : $default
} @{ $array_ref };
}
my %grades = ("Alice" => 100, "Bob" => 85, "Carol" => 92);
my @students = ("Alice", "Bob", "Eve");
以下代码按预期工作:
my @student_grades = @grades{ @students };
@student_grades = undef_to_value(@student_grades, 0);
print Dumper(\@student_grades);
# $VAR1 = [
# 100,
# 85,
# 0
# ];
但是,尝试传递哈希切片会导致 Type of arg 1 to main::undef_to_value must be array (not hash slice):
my @student_grades = undef_to_value( @grades{ @students }, 0 );
如何通过赋值将哈希切片哄入数组中,但不能在子例程调用期间?
有没有办法让失败的例子作为一个单一的任务工作?
【问题讨论】:
-
您使用的是哪个 Perl 版本?
-
defined($_) ? $_ : $default通常写成$_ // $default。另请注意,应避免使用子例程原型,因为正如您所见,它们几乎肯定不会做您希望它们做的事情。它们旨在编写模拟内置 Perl 运算符行为的库函数,而这肯定不是您在此处所做的。 -
//从 5.10 开始可用。 -
我必须记住
//,它似乎很有用。至于避免原型,我正在编写的代码可能会被那些不太精通 perl 的人使用和修改。原型帮助我避免了很多关于我需要检查哪种边缘情况的猜测。