0

文字列配列に特定の値が含まれているかどうかを確認するサブ プロシージャを perl で作成しました。

sub check_if_entity_exists() {

    my $entity      = shift;
    my @entityarray = @_;

    print "my entity to be checked $entity  \n";
    print "entity array before change  @entityarray : \n";

    join(" ", map { s/^\s*|\s*$//g; $_ } @entityarray);

    print " array after change @entityarray \n";

    my $status = "FALSE";

    if (grep { $_ eq $entity } @entityarray) {
        $status = "TRUE";
        return $status;
    }
    else {
        return $status;
    }
}

上記のコード@entityarray= xyz.com $entity= xyz.com エンティティはエンティティ配列にあるため、true に設定することを期待していますが、フローは false になります。

出力ログ: チェック対象の my entity xyz.com 変更前のエンティティ配列 xyz.com : 変更後の配列 xyz.com

4

1 に答える 1

3

check_if_entity_existsサブルーチンの空のプロトタイプがあります。これは、このサブルーチンにパラメーターがあってはならないことを主張していますが、これは間違っています。Perl でプロトタイプを使用するべきではありません- それらは他の言語のプロトタイプとは異なる動作をし、非常に特定の目的のために意図されています。

map無効なコンテキストでも使用しjoinており、すぐに破棄される文字列を生成します。あなたはいつも持っているべきです

use strict;
use warnings;

すべてのプログラムの一番上に

void コンテキストでの結合の無駄な使用

そして、mapループを次のように書く必要があります

for (@entityarray) {
  s/^\s+//;
  s/\s+\z//;
}

それ以外は、あなたのコードは私にとって必要なことを行います。こう呼んだら

my @entityarray = ('    xyz.com    ');
my $entity = 'xyz.com';

print check_if_entity_exists($entity, @entityarray);

出力

my entity to be checked xyz.com  
entity array before change      xyz.com     : 
 array after change xyz.com 
TRUE

のようにfirst関数 fromを使って書くと良いでしょう。List::Util

use List::Util 'first';

sub check_if_entity_exists {
  my $entity = shift;
  defined(first { /^\s*\Q$entity\E\s*$/ } @_) ? 'TRUE' : 'FALSE';
}
于 2013-04-18T10:01:05.393 に答える