2014-04-02 29 views
3

所以我有一個名爲push的方法。在這個方法裏面,我調用perl的內建函數push。現在我有另一個名爲unshift的方法,並且在這個方法裏面,我再次調用perl的內建push函數。與perl內部名稱相同的程序包方法

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 } 

該程序運行,但我得到這個警告Ambiguous call resolved as CORE::push() ... line 12

因此,我將第12行更改爲CORE::push @{ $self->{nodes} } => $node,並且警告消失。

perl怎麼沒有提醒我關於第6行? 有沒有更好的方法來擺脫警告?我無法更改方法名稱。

回答

5

注意,顯示如果子程序被交換根本沒有警告:

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

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

...但也有他們的如果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. 

我猜測是在分析整個子程序的正文之前,包中定義的push名稱基本上不會被考慮在內。這就是爲什麼在子程序中這個調用不被認爲是模糊的。

不過,我寧願預先將所有相應的呼叫都用CORE::作爲前綴,正如perldiag中的建議。

要靜默解釋[子程序名]作爲Perl的操作者,可使用在操作者(例如CORE::log($x))的CORE::前綴 或聲明子程序是一個對象的方法。

+0

+1尼斯抓:) – Miller

1

您可以從警告與method屬性聲明的方法,使其免疫:

sub push :method { 
    ... 
} 

在這一點上它仍然是可用作爲一個對象

$obj->push # resolves to the method defined above 

上的方法但常規push作爲核心運營商的任何用途解析爲常規CORE::push

push @array, $more; # resolves to CORE::push 
相關問題