与perl builtin同名的package方法

eri*_*ckb 3 perl

所以我的模块有一个名为的方法push.在这个方法中,我调用了perl的内置push函数.现在我有另一个名为的unshift方法,在这个方法中,我再次调用perl的内置push函数.

 1 package Deque;
 2 
 3 ...
 4 sub push {
 5   my ($self, $node) = @_;
 6   push @{ $self->{nodes} } => $node;
 7   ...
 8 }
 9
10 sub unshift {
11   my ($self, $node) = @_;
12   push @{ $self->{nodes} } => $node;
13   ...
14 }
Run Code Online (Sandbox Code Playgroud)

该程序运行,但我收到此警告Ambiguous call resolved as CORE::push() ... line 12.

所以我将第12行更改为CORE::push @{ $self->{nodes} } => $node,警告消失了.

为什么perl没有警告我第6行?有没有更好的方法摆脱警告?我无法更改方法名称.

rai*_*7ow 5

请注意,如果交换子例程,则不会显示任何警告:

sub unshift {
   my ($self, $node) = @_;
   push @{ $self->{nodes} } => $node;
}

sub push {
   my ($self, $node) = @_;
   push @{ $self->{nodes} } => $node;
}
Run Code Online (Sandbox Code Playgroud)

......但如果预先宣布,则有两个push:

sub push;

sub unshift {
   my ($self, $node) = @_;
   push @{ $self->{nodes} } => $node;
}

sub push {
   my ($self, $node) = @_;
   push @{ $self->{nodes} } => $node;
}

# Ambiguous call resolved as CORE::push(), qualify as such or use & at line 10.
# Ambiguous call resolved as CORE::push(), qualify as such or use & at line 15.
Run Code Online (Sandbox Code Playgroud)

我的猜测是,push在解析整个子例程的主体之前,基本上不会考虑包中定义的名称.这就是为什么在子程序中这个调用不被认为是模棱两可的.

尽管如此,我还是假设CORE::perldiag中建议使用前缀添加所有相应的呼叫.

要将[子例程名称]静默解释为Perl运算符,请CORE::在运算符上使用前缀(例如CORE::log($x))或将子例程声明为对象方法.