Вы должны добавить его пространство имен, которое включено в EntityFramework.dll
.
Пожалуйста, найдите его здесь .
$arg_ref
скаляр, так как он использует $
символ. По-видимому, это содержит ссылку хеша. Таким образом да, %$arg_ref
отсрочки та ссылка хеша. Другой способ записать это %{$arg_ref}
. Это делает намерение кода немного более ясным, хотя более подробный.
Заключить в кавычки из perldata(1)
:
Scalar values are always named with '$', even when referring
to a scalar that is part of an array or a hash. The '$'
symbol works semantically like the English word "the" in
that it indicates a single value is expected.
$days # the simple scalar value "days"
$days[28] # the 29th element of array @days
$days{'Feb'} # the 'Feb' value from hash %days
$#days # the last index of array @days
Таким образом, Ваш пример был бы:
%$arg_ref # hash dereferenced from the value "arg_ref"
my($arg_ref) = @_;
захватывает первый объект в стопке аргумента функции и помещает его в названную локальную переменную $arg_ref
. Вызывающая сторона ответственна за передачу ссылки хеша. Более канонический способ записать это:
my $arg_ref = shift;
Для создания ссылки хеша, Вы могли запустить с хеша:
some_sub(\%hash);
Или можно создать его с анонимной ссылкой хеша:
some_sub({pi => 3.14, C => 4}); # Pi is a gross approximation.
Хорошее краткое введение в ссылки (создающий их и использующий их) в Perl perldoc perfeftut
. Можно также считать его онлайн (или получить его как PDF). (Это говорит больше о ссылках в сложных структурах данных, чем с точки зрения передачи в и из подпрограмм, но синтаксис является тем же.)
Вместо того, чтобы разыменовать весь хеш как этот, можно захватить отдельные объекты с
$arg_ref->{key}
my %hash = ( fred => 'wilma',
barney => 'betty');
my $hashref = \%hash;
my $freds_wife = $hashref->{fred};
my %hash_copy = %$hash # or %{$hash} as noted above.
Soo, какой смысл гибкости синтаксиса? Давайте попробуем это:
my %flintstones = ( fred => { wife => 'wilma',
kids => ['pebbles'],
pets => ['dino'],
}
barney => { # etc ... }
);
На самом деле для глубоких структур данных как это часто более удобно запуститься с касательно:
my $flintstones = { fred => { wife => 'Wilma',
kids => ['Pebbles'],
pets => ['Dino'],
},
};
Хорошо, таким образом, fred получает новое домашнее животное, 'Velociraptor'
push @{$flintstones->{fred}->{pets}}, 'Velociraptor';
Сколько домашних животных Fred имеет?
скаляр {flintstones-> {fred}-> {домашние животные}}
Давайте подадим их...
for my $pet ( @ {flintstones->{fred}->{pets} } ) {
feed($pet)
}
и так далее. Суп фигурной скобки может выглядеть немного пугающим сначала, но становится довольно легко иметь дело с ними в конце, пока Вы последовательны в способе, которым Вы имеете дело с ними.
Так как несколько ясно, что эта конструкция используется для обеспечения ссылки хеша как списка параметров, передаваемых по имени к sub, нужно также отметить что это
sub foo {
my ($arg_ref) = @_;
# do something with $arg_ref->{keys}
}
может быть излишество в противоположность просто распаковке _
sub bar {
my ($a, $b, $c) = @_;
return $c / ( $a * $b );
}
В зависимости от того, насколько сложный список аргументов.