#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}} = [];
должно быть похоже на это в JSdocuments[$self.DOCUMENT] = [];
, если предположить, что$self.DOCUMENT
это строка, которой она является.