1

コードスニペットの修正を手伝ってもらえますか。

タイプeqxyzであるが、namedserversではないサーバーをリストしたい。

our %SERVERS = (
  "rajesh1" => {type => 'xyz', sha => 'ram'},
  "rajesh2" => {type => 'xyz', sha => 'sita'},
  "rajesh3" => {type => 'xyz', named => ["raa"]},
  "rajesh4" => {type => 'xxx', named => ["rajjaj"]},
);

while ( my $mServer = each(%SERVERS) ) 
{ 
  if ("$SERVERS{$mServer}{type}" eq "xyz" && !"$SERVERS{$mServer}{named}" ) 
  {
    print "Name of the server is $mServer\n";        
  }
}

期待される結果:

rajesh1
rajesh2
4

3 に答える 3

2
  1. の定義の後にセミコロンがありません%SERVERS
  2. あなたはそれを呼び始め$mServer、そして後で言い$gServerます。一つを選ぶ!
  3. 周りの引用符を取り除きます(一度変更する$SERVERS{$mServer}{type}と、引用符は必要ありません)。$SERVERS{$mServer}{named}gServermServer
  4. 「rajesh1rajesh2」が表示されるはずですが、タイプはありません"prod"。そんなことがあるものか?タイプを"prod"…</li> に変更するとします。
  5. 「rajesh1rajesh2」が表示されるはずですが、印刷します"Name of the server is $mServer\n"(に変更gServerするとmServer)。それをただ"$mServer\n"に変更して…</li>
  6. …動作するはずです。

したがって:

our %SERVERS = (
    "rajesh1" =>  {type => 'prod', sha => 'ram'},
    "rajesh2" =>  {type => 'prod', sha => 'sita'},
    "rajesh3" =>  {type => 'xyz',  named => ["raa"]},
    "rajesh4" =>  {type => 'xxx',  named => ["rajjaj"]},
);

while (my $mServer = each %SERVERS) { 
    if ($SERVERS{$mServer}{type} eq "prod" && !$SERVERS{$mServer}{named}) {
        print "$mServer\n";
    }
}

それで:

$ perl test.pl 
rajesh1
rajesh2
$
于 2012-05-24T12:24:00.950 に答える
1

あなたが探しているdefined

if ($SERVERS{$mServer}->{type} eq "xyz" &&
    ! defined $SERVERS{$mServer}->{named} )
...

$gServerループ変数を使用するつもりだったと思われる未定義の変数を使用していました$mServeruse strict; use warnings;すべてのスクリプトで行う必要があります。これにより、この間違い(および他の多くの間違い)を簡単に見つけることができます。

好みに応じて、間接演算子を使用して->ハッシュ参照の内容にアクセスします。また、スタイルの変更として、いくつかの不必要な引用を削除しました。

于 2012-05-24T12:18:18.713 に答える
1

完全なサンプルで、両方eachの戻り値をキャッチします。これにより、視覚的な混乱が軽減されます。

use strict;
use warnings;

our %SERVERS = (
    "rajesh1" => {type => 'xyz',  sha => 'ram'},
    "rajesh2" => {type => 'xyz',  sha => 'sita'},
    "rajesh3" => {type => 'xyz',  named => ["raa"]},
    "rajesh4" => {type => 'xxx',  named => ["rajjaj"]},
    "rajesh5" => {type => 'prod', sha => 'ram'},
    "rajesh6" => {type => 'prod', named => ["jajaja"]},
);

while ( my( $mServer, $mData ) = each %SERVERS ) { 
    if ($mData->{type} eq "prod" && !$mData->{named}) {
        print "Name of the server is $mServer\n";
    }
}
于 2012-05-24T12:27:59.187 に答える