Что делает команда push в этом коде perl

#perl

Вопрос:

Я конвертирую какой-то старый код Perl в JavaScript, и меня немного смущает одна строка в приведенном ниже примере.

КОД PERL — Часть класса:

 sub add {
  # account, amount, description, [journal], [company],
  # [date], [control], [document], [reference], [source]
  my $class = shift;
  my ($par) = @_;

  my $self;
  $self->{JOURNAL} = SeekValue($par, $class->journal, 'journal', 'type', 'typ');
  $self->{COMPANY} = SeekValue($par, $class->company, 'company', 'co', 'com');
  $self->{DATE} = SeekValue($par, $class->date, 'date', 'dat');
  $self->{CONTROL} = SeekValue($par, $class->control, 'control', 'con', 'cont', 'ctl');
  $self->{DOCUMENT} = SeekValue($par, $class->document, 'document', 'doc');
  $self->{REFERENCE} = SeekValue($par, $class->reference, 'reference', 'ref');
  $self->{SOURCE} = SeekValue($par, $class->source, 'PL', 'source', 'src');

  # Required fields.
  my $amount = conv_amount(SeekValue($par, undef, 'amount', 'amnt', 'amt'), 2);
  return 0 unless abs($amount); # Don't add this transaction if there isn't an amount.
  $self->{ACCOUNT} = $amount;
  $self->{AMOUNT} = SeekValue($par, undef, 'account', 'acct', 'act');
  $self->{DESCRIPTION} = SeekValue($par, undef, 'description', 'desc', 'des');

  bless $self;
  push(@{$class->{DOCUMENTS}->{$self->{DOCUMENT}}}, $self);
  return 1;
}
 

Я ДУМАЮ, что то, что он делает, это:

  • Получение экземпляра класса $class
  • получение входящего параметра $par , который был передан в качестве объекта
  • Создание нового объекта $self
  • Копирование значений из $par в $self (значение поиска используется для разрешения различных имен свойств)
  • bless $self Все еще не уверен, что это на самом деле значит
  • Тогда я действительно не знаю, что push он делает. Это добавление новой копии $self в свойство $DOCUMENTS текущего экземпляра класса?

Последняя строка-это мой вопрос. Что делает толчок? И на что это влияет?

Комментарии:

1. bless $self; это то, что создает объект (в смысле экземпляра класса, а не запутанный термин, который JS использует для ассоциативных массивов). Поскольку они забыли передать $class в качестве второго аргумента, он создает объект класса main .

2. Этот файл действительно package OWI::Arkona; находится вверху. Будет ли он использовать это как класс или все равно будет использовать main ?

3. Моя вина, OWI::Arkona

4. Re » будет ли это правильный перевод «, не уверен. Зависит от того, является ли this.DOCUMENT это строкой или нет. Объекты JS могут содержать только строки для ключей. То же самое с хэшами Perl, но строковые выражения могут отличаться на двух языках. В противном случае, скорее всего, да.

Ответ №1:

 push @{ $class->{DOCUMENTS}->{ $self->{DOCUMENT } } }, $self;
 

также может быть записано как

 if (!defined($class->{DOCUMENTS})) {  # Probably already exists.
   $class->{DOCUMENTS} = {};
}

my $documents = $class->{DOCUMENTS};

if (!defined($documents->{ $self->{DOCUMENT} })) {
   $documents->{ $self->{DOCUMENT } = [];
}

push @{ $documents->{ $self->{DOCUMENT } } }, $self;
 

Это добавление ссылки на вновь созданный объект в массив. На этот массив ссылается ассоциативный массив (хэш в Perl, объект в JS), введенный документом. Массив создается, если он еще не существует.

Комментарии:

1. Итак $class->{DOCUMENTS}->{$self->{DOCUMENT}} , используется ли значение $self->{DOCUMENT} в качестве ключа в хэше массива и $self в качестве значения для ввода в массив? Кроме того, в этом коде не было каждого подкласса, так что это не было бы проблемой.

2. Нет, значение хэша-это массив. См.Обновление.

3. Будет $self->{DOCUMENTS} ли в Perl так же, как self.DOCUMENTS в JavaScript?

4. Да, извините, и я уже изменил свой ответ, чтобы отразить это. Сначала я предположил $class , что это строка, но, вероятно, это не так. (Конструкторы, каковыми они являются, обычно ожидают, что в качестве первого аргумента будет строка, состоящая из имени класса, и параметр часто именуется $class .)

5. Конструктор-это другая функция. Но я думаю, что теперь я понимаю это. Мы высоко ценим вашу помощь. Это в Perl $documents->{$self->{DOCUMENT}} = []; должно быть похоже на это в JS documents[$self.DOCUMENT] = []; , если предположить, что $self.DOCUMENT это строка, которой она является.