如何将一个数组和一个字符串作为参数传递给函数?

Iva*_*ang 4 arrays string parameters perl function

因为我找不到方便的方法来检查是否$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);
Run Code Online (Sandbox Code Playgroud)

ike*_*ami 7

您不能将数组传递给subs,只传递标量列表.

ifin(@f, $k);
Run Code Online (Sandbox Code Playgroud)

是相同的

ifin($f[0], $f[1], $f[2], $f[3], $k);
Run Code Online (Sandbox Code Playgroud)

因为@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");
Run Code Online (Sandbox Code Playgroud)

顺便说一下,这也可以写成:

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

您可以使用保留现有的调用约定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");
Run Code Online (Sandbox Code Playgroud)