Лучший способ передачи хешей и массивов - ссылка .Ссылка - это просто способ говорить о сложной структуре данных как о единой точке данных - о чем-то, что может быть сохранено в скалярной переменной (например, $foo
).
Читатьна ссылках , чтобы вы понимали, как создать ссылку и разыменование ссылку для возврата исходных данных.
Само основы: вы предшествуете своим даннымструктура с обратной косой чертой для получения ссылки на эту структуру.
my $hash_ref = \%hash;
my $array_ref = \@array;
my $scalar_ref = \$scalar; #Legal, but doesn't do much for you...
Ссылка - это область памяти исходной структуры (плюс подсказка о структуре):
print "$hash_ref\n";
Напечатает что-то вроде:
HASH(0x7f9b0a843708)
Чтобы вернуть ссылку в пригодный для использования формат, вы просто помещаете ссылку в правильный символ перед:
my %new_hash = %{ $hash_ref };
Вы должны узнать об использовании ссылок, поскольку именно так вы можете создавать чрезвычайно сложные структуры данных в Perl и как работает объектно-ориентированный Perl.
Допустим, вы хотите пройти трихеши к вашей подпрограмме.Вот три хеша:
my %hash1 = ( this => 1, that => 2, the => 3, other => 4 );
my %hash2 = ( tom => 10, dick => 20, harry => 30 );
my %hash3 = ( no => 100, man => 200, is => 300, an => 400, island => 500 );
Я создам для них ссылки
my $hash_ref1 = \%hash1;
my $hash_ref2 = \%hash2;
my $hash_ref3 = \%hash3;
А теперь просто передам ссылки:
mysub ( $hash_ref1, $hash_ref2, $hash_ref3 );
Ссылки скалярные данные, поэтому нет проблем с передачей их в мою подпрограмму:
sub mysub {
my $sub_hash_ref1 = shift;
my $sub_hash_ref2 = shift;
my $sub_hash_ref3 = shift;
Теперь я просто разыменовываю их, и моя подпрограмма может их использовать.
my %sub_hash1 = %{ $sub_hash_ref1 };
my %sub_hash2 = %{ $sub_hash_ref2 };
my %sub_hash3 = %{ $sub_hash_ref3 };
Вы можете увидеть, на что ссылается ссылка, используя команду ref :
my $ref_type = ref $sub_hash_ref; # $ref_type is now equal to "HASH"
Это полезно, если вы хотите убедиться, что вы передали правильный типструктуры данных.
sub mysub {
my $hash_ref = shift;
if ( ref $hash_ref ne "HASH" ) {
croak qq(You need to pass in a hash reference);
}
Также обратите внимание, что это ссылки на память, поэтому изменение ссылки изменит исходный хеш:
my %hash = (this => 1, is => 2, a => 3 test => 4);
print "$hash{test}\n"; # Printing "4" as expected
sub mysub ( \%hash ); # Passing the reference
print "$hash{test}\n"; # This is printing "foo". See subroutine:
sub mysub {
my $hash_ref = shift;
$hash_ref->{test} = "foo"; This is modifying the original hash!
}
Это может быть хорошо - это позволяет вамизменить данные, переданные в подпрограмму, или неверные - это позволяет вам непреднамеренно изменить данные, переданные в исходную подпрограмму.