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);
4

5 回答 5

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");
于 2012-05-17T18:03:28.390 回答
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.
于 2012-05-17T18:10:16.203 回答
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.
于 2012-05-18T04:23:01.793 回答
1

您可以以相反的顺序 ( print ifin($k, @f);) 传递参数,因此数组排在最后。当您现在从子例程中捕获它们时,字符串首先出现,然后数组将填充任何列表项。

于 2012-05-17T18:17:10.213 回答
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);

对于长列表,您也避免复制每个列表元素。

于 2012-05-17T18:03:37.070 回答