2013-07-23 100 views
0

我有一個類似的代碼進行排序:用Perl評估和演示

sub mySub{ 
    my $sortMethod = shift; 
    my @arr = @_; 

    my @finalArr = eval "$sortMethod @arr"; 
    foreach(@finalArr){ 
     ...do something.... 
    } 
} 

然後我想這樣稱呼它:

mySub('reverse', @someArr); 

或:

mySub('sort', @someArr); 

,但我得到錯誤:

找到操作員預期的數字(eval 2)line 1,near「1 2」 (Missing operator before 2?) 運營商在(eval 2)第1行,在「2 3」附近發現的號碼 (Missing operator before 3?)

我發送的數組包含1到5的數字(作爲示例)

有人能告訴我我做錯了什麼嗎?

感謝

+2

你爲什麼用eval嗎? – 2013-07-23 09:43:23

+0

,因爲我想根據任何人想要對它進行排序來對數組進行排序,一個特定的情況可能是'sort mySpecificSort()',然後我打印該數組,我想使它動態化,而不是非常具體,只是讓那個調用方法的人指定他自己的排序方法 –

回答

3

錯誤已經告訴你什麼是錯

數量,其中運營商預計將在(EVAL 2)1號線,靠近 「1 2」(缺少操作前2?)

它發現一個數字,它預期的操作員。運營商將是逗號運營商。它告訴你它在數字2之前的位置。

當你插入一個數組時,元素被$"中包含的任何內容連接,默認情況下它是空格。所以你的評價字符串變成

sort 1 2 3 4 

哪個當然不起作用。你需要使它成爲一個逗號分隔的字符串,你可以做像這樣:

... "$sortmethod " . join(",", @arr); 

您可能會感興趣的另一種方法來做到這一點:

my @reversed = foo(sub { reverse @_ }, @list); 
my @sorted = foo(sub { sort @_ }, @list); 

sub foo { 
    my $code = shift; 
    $code->(@_); 
} 

另一種替代方法,它允許你使用字符串來查找排序方法:

my %sort = (
    'numasc' => \&sort_num_asc, 
    'asc'  => \&sort_asc, 
    'desc'  => \&sort_desc, 
); 

my @list = $sort{$method}->(@arr): 

sub sort_num_asc { 
    sort { $a <=> $b } @_; 
} 
sub sort_asc { 
    sort @_; 
} 
sub sort_desc { 
    sort { $b cmp $a } @_; 
} 
+0

即使我指定並排列爲@ arr =(3,1,2,5,4)也不起作用 –

+0

我在以另一種方式考慮* * + 1 **解決'eval'問題和替代方法,我喜歡更多。 – Birei

+0

@Birei這是傳遞代碼塊的經典方法。這很不錯,除了額外的打字,但以我喜歡的方式。我懷疑它可能會減少到原型的正確'sort' /'map'樣式,但我從不喜歡使用這些樣式。 – TLP

1

您是否嘗試在eval字符串中轉義數組?

我認爲這應該工作:這裏

my @finalArr; 
my $res = eval "\@finalArr = $sortMethod \@arr"; 

問題是,你與你的@arr的真正價值加入$ sortMethod。我想你想結果和這樣的事情:而不是

eval "sort @arr"; 

eval "sort 1,2,3"; 
+0

感謝一堆,就是這樣:) –

+0

確實,它確實修改了@arr的原始值。在我的情況下,@arr來自xml文件,並且我使用CGI在html中打印它,這是來自apache的錯誤'修改只讀值在......' –

+0

嘗試使用以下行: 我的@finalArr; my $ res = eval「\ @finalArr = $ sortMethod @arr」; 和$ res將保持您的eval的結果狀態。 – Sedi