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

サブルーチンに配列を渡すことはできません。スカラーのリストのみを渡します。

ifin(@f, $k);

と同じです

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

@fその要素のリストに評価されるためです。

配列をサブルーチンに渡す 1 つの方法は、参照を渡すことです。

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 に答える