1

你能帮我更正代码片段吗?

我想列出类型为 eq xyz 但不是命名服务器的服务器。

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

预期结果:

拉杰什1
拉杰什2
4

3 回答 3

2
  1. 您在 . 的定义之后缺少一个分号%SERVERS
  2. 你开始叫它$mServer,然后再说$gServer。选一个!
  3. 去掉周围的引号$SERVERS{$mServer}{type}$SERVERS{$mServer}{named}(一旦你改为gServer——mServer你就不需要它们了。
  4. 您希望看到“rajesh1 rajesh2”,但它们都没有 type "prod"。这怎么可能?假设您将它们的类型更改为"prod"……</li>
  5. 您希望看到“rajesh1 rajesh2”,但您打印"Name of the server is $mServer\n"(一旦您更改gServermServer)。将其更改为"$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

完整的示例,捕获两个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 回答
1

您正在寻找defined.

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

您使用的是未定义的变量$gServer,显然您打算使用循环变量$mServer。您应该use strict; use warnings;在所有脚本中;这使得很容易发现这个错误(以及许多其他错误)。

我使用间接运算符->来访问哈希引用的内容作为偏好。我还删除了一些无端引用作为文体变化。

于 2012-05-24T12:18:18.713 回答