因为我找不到方便的方法来检查$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);
答案 0 :(得分:7)
您无法将数组传递给subs,只传递标量列表。
ifin(@f, $k);
与
相同ifin($f[0], $f[1], $f[2], $f[3], $k);
因为@f
计算其元素列表。
将数组传递给sub的一种方法是传递引用。
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");
答案 1 :(得分:3)
您可能想要检查List :: 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.
答案 2 :(得分:2)
智能匹配中的$str ~~ @arr
怎么样?这在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.
答案 3 :(得分:1)
你可以以相反的顺序(print ifin($k, @f);
)传递你的参数,所以数组是最后的。当您从子程序中捕获它们时,字符串首先出现,并且数组后面的任何列表项都会填充。
答案 4 :(得分:0)
你可以使用原型,但那些很脆弱。我会传递对@f
的引用作为第一个参数,如下所示:
use 5.010;
use strict;
use warnings;
sub ifin
{
my ($array,$str)=@_;
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);
对于长列表,您也可以避免复制每个列表元素。