Как я разыменовываю ссылку хеша Perl, это было передано подпрограмме?

Я все еще пытаюсь разобраться в своем разыменовании хеша. Моя текущая проблема, я теперь передаю hashref sub, и я хочу разыменовать ее в рамках той замены, Но я не нахожу, что корректный метод/синтаксис делает это. В sub я хочу выполнить итерации ключей хеша, но синтаксис для hashref не является тем же как хешем, который я знаю, как сделать.

Таким образом, то, что я хочу, должно сделать это:

sub foo {
    %parms = @_;
    foreach $keys (key %parms) { # do something };
}

но с hashref, передаваемым во вместо хеша.

Любые указатели (игра слов, не предназначенная), приветствуются.

Спасибо.

6
задан brian d foy 22 February 2010 в 00:07
поделиться

4 ответа

На самом деле я еще не тестировал код, но, написав от руки, вы захотите сделать что-то вроде этого:

sub foo {
    $parms = shift;
    foreach my $key (keys %$parms) { # do something };
}
3
ответ дан 16 December 2019 в 21:39
поделиться

Вот один из способов разыменования хеш-ссылки, переданной в подпрограмму:

use warnings;
use strict;

my %pars = (a=>1, b=>2);
foo(\%pars);
sub foo {
    my ($href) = @_;
    foreach my $keys (keys %{$href}) { print "$keys\n" }
}

__END__
a
b

См. Также Краткая справка и perlreftut

2
ответ дан 16 December 2019 в 21:39
поделиться
#!/usr/bin/perl
use strict;

my %params = (
    date => '2010-02-17',
    time => '1610',
);

foo(\%params);

sub foo {
    my ($params) = @_;
    foreach my $key (keys %$params) {
        # Do something
        print "KEY: $key VALUE: $params{$key}\n";
    };
}
1
ответ дан 16 December 2019 в 21:39
поделиться

Если переменная является частной , я часто не буду создавать для нее свойство. Если он каким-либо путь выставлен вне типа, я всегда выставляю его через свойство по разным причинам:

  • Это может быть не нужно сегодня, но если это станет необходимо позже это разрыв изменения
  • Привязка данных работает только на свойства, а не на поля (я думаю, не большой пользователь привязки данных)
  • Это позволяет вставить проверки, ведение журнала, точки останова при доступе к значению

Также, если поле открыто через свойство, я всегда доступ к нему через свойство, даже внутри класса.

Обновление
В ответ на ваши обновленные образцы кода: здесь можно рассмотреть ряд вопросов вокруг проектировать кода.

  • Читаемость против скорости
  • «Атомичность»
  • Другие побочные эффекты

Один типичный совет (который я нахожу очень хорошим) - «писать для ясности, проверять на исполнение». Это означает, что когда вы пишете свой код, ваша первая проблема должна быть в том, ясно ли, что код делает, глядя на него. Это часто (но не всегда) важнее, чем сырая скорость кода. Оптимизация скорости записи после определения места ее получения. Доступ к свойству будет намного медленнее, чем чтение поля напрямую, но в большинстве случаев разница будет ничтожной (если она вообще поддается измерению).

Атомичность может быть проблемой. Учитывая ваш образец кода, у нас есть поле скорость , которое открыто через свойство Скорость . Если метод MultileSpeed должен выполнить несколько обновлений значения, эти промежуточные значения будут доступны через свойство Speed в разное время, пока выполняется вычисление. Это справедливо независимо от того, обновляется ли поле непосредственно или через свойство. В подобных случаях, возможно, лучше сначала поместить значение в локальную переменную, использовать это для вычислений и присвоить значение этой переменной обратно свойству по завершении.

Наконец, другие побочные эффекты. Возможно, изменение значения Speed вызовет событие (например, SpeedChanged ). В подобных случаях также, вероятно, целесообразно не обновлять данные до тех пор, пока не будет выполнен расчет.

Я хотел бы думать о собственности как контракт и поле как реализация . Любой (кроме ядра моего типа), которому нужна стоимость, должен использовать контракт. Полагаться на реализацию следует только при наличии веских причин для обхода договора.

И да, если вы инкапсулируете доступ к полю в свойство, естественно, изменение имени поля потребует меньшего количества обновлений (и, возможно, также имя поля становится менее важным).

Я надеюсь, что это имеет смысл, и не слишком много нет темы;)

-121--1728845-

sub foo
{
    my $params = $_[0];
    my %hash = %$params;
        foreach $keys (keys %hash)
        {
         print $keys;
        }
}

my $hash_ref = {name => 'Becky', age => 23};

foo($hash_ref);

Также хорошее введение о ссылках здесь .

2
ответ дан 16 December 2019 в 21:39
поделиться
Другие вопросы по тегам:

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