3

{IS-VAR}このコードでは、 hash の配列の各要素のkey の値にアクセスしたいと考えています@Cleared。ループ内に入る$_と の値に設定されます$_->{'NAME'}

if (grep {$_->{'NAME'} eq $entity_name} @Cleared)
{
  **$is_var = $_->{'IS-VAR'};**
  $var_flag = 1 if ($is_var =~ /^TRUE$/i);
}

このコンテキストの要素で$_->{'IS-VAR'}あるループ内の値にアクセスする方法はありますか?$_@Cleared

の構造@Clearedは次のとおりです。

@Cleared = [NAME => 'xxx',
            TYPE => 'yyy',
            IS-VAR => 'TRUE'];
4

2 に答える 2

10

コードの問題はgrepifステートメントで使用していることです。これは の結果をスカラー (見つかったgrep要素の数) に変換します。grepしたがって、どの要素が一致するかは実際にはわかりません。

これを for ループに変換すると、一致した各要素にアクセスできるようになります。コードの残りの部分は逐語的に機能します。

foreach (grep {$_->{'NAME'} eq $entity_name} @Cleared)
{
    $is_var = $_->{'IS-VAR'};
    $var_flag = 1 if ($is_var =~ /^TRUE$/i);
}

ただし、単一の行が一致したかどうかを単純に調べたい場合は、すべてを単一の grep に圧縮できます。

my $is_var = grep {
    $_->{'NAME'} eq $entity_name && $_->{'IS-VAR'} =~ /^TRUE$/i
} @Cleared;

$is_var一致した要素の数が含まれるようになりました 。if ($is_var) {...}少なくとも 1 つが一致した場合は true になります。

grepただし、少なくとも 1 つの一致があるかどうかだけを知る必要がある場合は、最も効率的な方法ではありません。理想的には、一致するものが 1 つ見つかったらすぐに停止する必要があります。

my $is_var;
foreach (@Cleared)
{
    if ($_->{'NAME'} eq $entity_name && $_->{'IS-VAR'} =~ /^TRUE$/i)
    {
        $is_var = 1;
        last;          #break out of the loop
    }
}
于 2013-04-25T07:51:28.083 に答える
0

より単純な for ループを試すことができます。

for my $cleared (@Cleared) {
  if ($cleared->{NAME} eq $entity_name && $cleared->{IS_VAR} eq 'TRUE') {
    $var_flag = 1
   }
}
于 2013-04-25T07:45:01.547 に答える