Как передать один массив и одну строку в качестве аргументов функции?

Потому что я не могу найти удобный способ проверить,$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);

Ответы на вопрос(5)

: 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.

Как насчет$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.

только списки скаляров.

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

print ifin($k, @f);), поэтому массив будет последним. Когда вы ловите их сейчас из подпрограммы, строка стоит первой, а массив заполняется любыми элементами списка после нее.

но он довольно хрупкий. Я бы передал ссылку на@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);

Для длинного списка вы также избегаете делать копии каждого элемента списка.

ВАШ ОТВЕТ НА ВОПРОС