Я считаю себя делает этот паттерн много в PerlКак преобразовать массив в хэш, с именами переменных, отображаемыми как ключи в Perl?
sub fun {
my $line = $_[0];
my ($this, $that, $the_other_thing) = split /\t/, $line;
return { 'this' => $this, 'that' => $that, 'the_other_thing' => $the_other_thing};
}
Очевидно, что я могу упростить эту схему, возвращая выходной функции, которая преобразует заданный массив переменных в карту, где ключи являются одни и те же имена как переменные, например,
sub fun {
my $line = $_[0];
my ($this, $that, $the_other_thing) = split /\t/, $line;
return &to_hash($this, $that, $the_other_thing);
}
Это помогает по мере увеличения количества элементов. Как мне это сделать? Похоже, я мог объединить блокировки PadWalker &, но мне хотелось бы сделать это, используя только основной язык.
EDIT: thb обеспечил умное решение этой проблемы, но я не проверял его, потому что он обходит множество жестких частей (tm). Как вы это сделаете, если хотите полагаться на семантику деструкции основного языка и отвлечь отражение от реальных переменных?
EDIT2: Вот решение, которое я намекнул на использование PadWalker & закрытия:
use PadWalker qw(var_name);
# Given two arrays, we build a hash by treating the first set as keys and
# the second as values
sub to_hash {
my $keys = $_[0];
my $vals = $_[1];
my %hash;
@hash{@$keys} = @$vals;
return \%hash;
}
# Given a list of variables, and a callback function, retrieves the
# symbols for the variables in the list. It calls the function with
# the generated syms, followed by the original variables, and returns
# that output.
# Input is: Function, var1, var2, var3, etc....
sub with_syms {
my $fun = shift @_;
my @syms = map substr(var_name(1, \$_), 1), @_;
$fun->(\@syms, \@_);
}
sub fun {
my $line = $_[0];
my ($this, $that, $other) = split /\t/, $line;
return &with_syms(\&to_hash, $this, $that, $other);
}
И ваш вопрос ...? –
Упс, извините. Ты поймал меня в середине редактирования. :) – user787747