2010-03-12 42 views
26

此代碼觸發以下投訴:爲什麼Perl抱怨「使用隱式拆分到@_已被棄用」?

#!/usr/bin/perl 
use strict; 
use warnings; 

my $s = "aaa bbb"; 
my $num_of_item = split(/\s+/, $s) ; 
print $num_of_item; 

當我運行的代碼,Perl中抱怨說, 「Use of implicit split to @_ is deprecated」。 我真的沒有問題的「背景」,所以我希望你幫忙解釋一下 代碼有什麼問題。

+1

你確定你要整的錯誤信息呢?我的perl也在第6行告訴我這個問題。由於拆分是在第6行,所以閱讀拆分文檔告訴我第二段中的問題。 :) – 2010-03-17 03:10:46

回答

33

您在標量上下文中使用split,並在標量上下文中將其分割爲@_數組。 Perl警告你,你可能只是毆打@_。 (有關詳細信息,請參閱perldoc split

要得到字段的數量,使用此代碼:

my @items = split(/\s+/, $s); 
my $num_of_item = @items; 

my $num_of_item =() = split /\s+/, $s, -1; 

注:拆分的三個參數的形式()是因爲沒有指定限制,分割只會分割一塊(比分配中需要的多一個)。

+0

或保持簡潔,'my $ num_of_item =()= split(/ \ s + /,$ s)' – mob 2010-03-12 22:10:38

+0

@mobrule:您的評論遲到:-) – 2010-03-12 22:13:50

+1

帶(()的方法不適用於我; $ num_of_item剛被設置爲1. – 2010-03-12 22:22:39

10

split文檔:

在標量環境,返回找到的字段數。在標量和無效上下文中,它分成@_數組。不過,在標量和無效上下文中使用拆分是因爲它會破壞你的子程序參數。

因此,由於您在標量上下文中使用它,因此它將拆分爲@_數組,這是一個不推薦的用法。 (它必須做分割,因爲它會破壞舊代碼,期望它分裂成@_ - 如果沒有分配到臨時數組中,沒有辦法繞過警告,據我所知,尤金Y在他的答案中明確地表明瞭這一點。 )

15

diagnostics提供更多信息:

use strict; 
use warnings; 
use diagnostics; # comment this out when you are done debugging 

my $s = "aaa bbb"; 
my $num_of_item = split(/\s+/, $s) ; 
print $num_of_item; 

使用隱裂到@_已棄用

(d棄用,W語法)這讓很多工作,爲當編譯器 你會打開一個子程序的參數列表,所以最好是將一個split()的結果明確地分配給一個數組(或列表)。

一個更好的方式來獲得診斷信息是通過命令行:

perl -Mdiagnostics my_program.pl 
+1

當你得到你不明白的警告信息時,'use diagnostics'是一個真正的培根保護程序 – mob 2010-03-12 22:09:39

+1

@mobrule:你也可以簡單地在'perldoc perldiag'中查找這些信息( http://perldoc.perl.org/perldiag.html)的更長的解釋。 – Ether 2010-03-12 22:17:00

+1

或通過'splain'(http://perldoc.perl.org/splain.html)發出警告。 – ephemient 2010-03-12 23:55:52

相關問題