$var % разыменовывает хеш Perl?

Вы должны добавить его пространство имен, которое включено в EntityFramework.dll.

Пожалуйста, найдите его здесь .

9
задан brian d foy 4 February 2010 в 02:25
поделиться

5 ответов

$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.
20
ответ дан 4 December 2019 в 06:41
поделиться

Хорошее краткое введение в ссылки (создающий их и использующий их) в Perl perldoc perfeftut. Можно также считать его онлайн (или получить его как PDF). (Это говорит больше о ссылках в сложных структурах данных, чем с точки зрения передачи в и из подпрограмм, но синтаксис является тем же.)

4
ответ дан 4 December 2019 в 06:41
поделиться

Вместо того, чтобы разыменовать весь хеш как этот, можно захватить отдельные объекты с

$arg_ref->{key}
7
ответ дан 4 December 2019 в 06:41
поделиться
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)
}

и так далее. Суп фигурной скобки может выглядеть немного пугающим сначала, но становится довольно легко иметь дело с ними в конце, пока Вы последовательны в способе, которым Вы имеете дело с ними.

3
ответ дан 4 December 2019 в 06:41
поделиться

Так как несколько ясно, что эта конструкция используется для обеспечения ссылки хеша как списка параметров, передаваемых по имени к sub, нужно также отметить что это

sub foo {
  my ($arg_ref) = @_;
  # do something with $arg_ref->{keys}
}

может быть излишество в противоположность просто распаковке _

sub bar {
  my ($a, $b, $c) = @_;
  return $c / ( $a * $b );
}

В зависимости от того, насколько сложный список аргументов.

1
ответ дан 4 December 2019 в 06:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: