2012-05-17 24 views
4

因爲我找不到一個方便的方法來檢查$str是否在@array,我試圖自己做一個,但它不工作。如何將一個數組和一個字符串作爲參數傳遞給函數?

我想這是因爲數組和字符串的混淆。它一直給0$str。請讓我知道如何解決它。

use 5.010; 
use strict; 
use warnings; 

sub ifin { 
    my (@array, $str) = @_; 
    for my $i (@array) { 
     if ($i eq $str) { 
      return 1; 
     } 
    } 
    return 0; 
} 

my @f = (1, 2, 3, 4); 
my $k = 1; 
print ifin(@f, $k); 
+1

你不能避開這個由輪交換的參數,然後將字符串中傳遞,然後再數組? – andrewsi

+1

從[官方Perl常見問題解答](http://faq.perl.org):[如何判斷某個元素是否包含在列表或數組中?](http://learn.perl.org/faq /perlfaq4.html#How-can-I-tell-whether-a-certain-element-is-contained-in-a-list-or-array-) – daxim

+0

以前在堆棧溢出:http://stackoverflow.com/ question/720482/how-can-i-verify-that-a-value-is-present-in-an-array-list-in-perl http://stackoverflow.com/questions/4571046/perl-how-to -check-if-any-integers-in-a-list-of-integers-is-in-an-an-array http:// stackoverflow。com/questions/6942082 /更快的方式檢查數組元素 – daxim

回答

6

您不能將數組傳遞給subs,只有標量列表。

ifin(@f, $k); 

相同

ifin($f[0], $f[1], $f[2], $f[3], $k); 

因爲@f評估其元素的列表。

將數組傳遞給子的一種方法是傳遞引用。

sub ifin { 
    my ($array, $str) = @_; 
    for my $e (@$array) { 
     return 1 if $e eq $str; 
    } 

    return 0; 
} 

my @f = (1,2,3,4); 
my $k = 1; 
print(ifin(\@f, $k), "\n"); 

順便說一句,這也可以寫成:

my @f = (1,2,3,4); 
my $k = 1; 
print((grep { $_ eq $k } @f) ? 1 : 0, "\n"); 

您可以通過使用pop保持現有的調用約定。

sub ifin { 
    my $str = pop(@_); 
    for my $e (@_) { 
     return 1 if $e eq $str; 
    } 

    return 0; 
} 

my @f = (1,2,3,4); 
my $k = 1; 
print(ifin(@f, $k), "\n"); 
+0

'$ i'通常用於索引,所以我使用了'$ e'(用於「元素」)。 – ikegami

+0

增加了允許您保持currentl調用約定的替代方法。 – ikegami

+0

這是非常有用的,謝謝 –

0

你可以使用原型,但那些原型很脆弱。我會在參考傳遞給@f作爲第一個參數,像這樣:

use 5.010; 
use strict; 
use warnings; 

sub ifin 
{ 
my ($array,$str)[email protected]_; 
for my $i (@$array) 
{ 
    if ($i eq $str) 
    { 
    return True 
    } 
} 
return False 
} 


my @f= (1,2,3,4); 
my $k=1; 
print ifin(\@f,$k); 

對於一個長長的清單,你避免犯每個列表元素的副本,以及。

+1

從技術上講,即使你有原型爲你引用,你仍然在傳遞參考:) – ikegami

3

您可能要檢查列表中的任何:: MoreUtils包,你只需要使用它喜歡:

use List::MoreUtils 'any'; 

my @f= qw(1 2 3 4); 
my $k=10; 

print "yes\n" if(any { $_ == $k } @f); 

檢查的文檔:

perldoc List::MoreUtils. 
1

你可以通過你的論點相反順序(print ifin($k, @f);),所以數組將繼續。當你從子程序中捕獲它們時,字符串會先出現,然後數組會被填充任何後面的列表項。

2

$str ~~ @arr如何在smartmatch?這在Perl 5.10中可用。

use 5.010; 
use strict; 
use warnings; 

my $str = 'three'; 
my @arr = qw(zero one two three four); 
my @badarr = qw(zero one two four eight); 

say '$str ', $str ~~ @arr? 'is' : 'is not', ' in $arr.'; 
say '$str ', $str ~~ @badarr? 'is' : 'is not', ' in $badarr.'; 

輸出,如預期:

$str is in $arr. 
$str is not in $badarr. 
相關問題