这段 perl 代码中的 push 命令在做什么
What is the push command doing in this perl code
我正在将一些旧的 Perl 代码转换为 JavaScript,我对下面示例中的一行感到有点困惑。
PERL 代码 - class:
的一部分
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 实例
$class
- 获取传入参数
$par
,作为对象传入
- 创建新对象
$self
- 将值从
$par
复制到 $self
(SeekValue 用于允许不同的 属性 名称)
bless $self
仍然不确定这到底是做什么的
- 那我真的不知道
push
在做什么。是否将 $self
的新副本添加到 class 的当前实例的 属性 $DOCUMENTS
中?
最后一行是我的问题。 push在做什么?它有什么影响?
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 中的对象)引用。如果数组不存在,则创建该数组。
我正在将一些旧的 Perl 代码转换为 JavaScript,我对下面示例中的一行感到有点困惑。
PERL 代码 - class:
的一部分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 实例
$class
- 获取传入参数
$par
,作为对象传入 - 创建新对象
$self
- 将值从
$par
复制到$self
(SeekValue 用于允许不同的 属性 名称) bless $self
仍然不确定这到底是做什么的- 那我真的不知道
push
在做什么。是否将$self
的新副本添加到 class 的当前实例的 属性$DOCUMENTS
中?
最后一行是我的问题。 push在做什么?它有什么影响?
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 中的对象)引用。如果数组不存在,则创建该数组。