Почему бы не сделать свою собственную функцию:
use strict;
use warnings;
sub make_hash (@) {
my %h;
my @unresolved;
while ( @_ ) {
my ( $key, $value ) = splice( @_, 0, 2 );
next unless defined $value;
if ( not ref( $value )
and my ( $ref ) = $value =~ /^ref:\s*(.*\S)\s*$/
) {
if ( defined( my $v = $h{ $ref } )) {
$h{ $key } = $v;
}
else {
push @unresolved, [ $key, $ref ];
}
}
else {
$value =~ s/^lit://;
$h{ $key } = $value;
}
}
$h{ $_->[0] } = $h{ $_->[1] } foreach grep { exists $h{ $_->[0] }; } @unresolved;
return wantarray ? %h : \%h;
}
Чтобы продемонстрировать некоторые возможности:
my %hash
= make_hash(
'key1' => 'value1'
, 'key2' => 'value2'
, 'key3' => 'ref:key1'
, 'key4' => 'lit:ref:key2'
, 'key5' => 'lit:lit:ref:key3'
);
Префикс lit:
покрывает случай "Что если я * 1008"* действительно хотел бы передать значение, которое не является ссылкой, как 'ref:so-and-so'
? Это также рекурсивно в ответе: «Что, если мне прямо нужно сделать значение« lit: xzy ».
Я сделал это, и я также благословил ссылку на переданный фрагмент данных в класс Lit
или что-то в этом роде.
sub Ref ($) { bless \shift, 'Ref' }
А затем в процедуре make_hash
вы просто проверяете на ref( $value ) eq 'Ref'
.И укажите это следующим образом:
my %hash
= make_hash(
'key1' => 'value1'
, 'key2' => 'value2'
, 'key3' => Ref 'key1'
);
Есть много способов заставить Perl действовать так, как вы хотели бы.