まず、使わないでくださいXML::Simple
。それ自身のドキュメントはこれを言います
新しいコードでこのモジュールを使用することはお勧めできません。より単純で一貫したインターフェースを提供する他のモジュールが利用可能です。特に、XML::LibXML を強くお勧めします。
このモジュールの主な問題は、多数のオプションと、これらのオプションが相互作用する恣意的な方法であり、しばしば予期しない結果をもたらします。
を使用して、サブルーチン呼び出しまたはシェル コマンドの結果も確認する必要がありますData::Dump
。このようになります
perl -MData::Dump -E'dd `hostname`'
私のシステムではこれが表示されます
"Samurai-U\n"
うまくいけば、問題がわかりましたか?バックティックによって返される文字列には末尾の改行文字があり、$xmlObject
ハッシュにはそのようなキーを持つ要素があります。あなたはそれを修正することができます
chomp(my $host = `hostname`)
その後、あなたは書くことができます
my %systemHash = %{ $xmlObject->{SERVER}{$host} }
最後に、ここで行うようにハッシュの最初のレベルをすべてコピーするのは無駄です。
my %systemHash = %{$xmlObject->{SERVER}->{`hostname`}}
この情報を何に使用するかについては説明しませんが、一般的には、次を使用してハッシュ参照を抽出する方がはるかに優れています。
chomp( my $hostname = `hostname` );
my $systemHash = $xmlObject->{SERVER}{$hostname};
アップデート
適切な XML 解析モジュールを使用する方がはるかに優れています。
を使用したソリューションの例を次に示します。XML::LibXML
use strict;
use warnings;
use 5.010; # For 'say'
use XML::LibXML;
my ($xml_file) = @ARGV;
my $xml = XML::LibXML->load_xml(location => $xml_file);
my @servers = $xml->findnodes('/main/server');
my @server_names = map $_->findvalue('@hostname'), @servers;
say "- $_" for @server_names;
入力ファイル
<main>
<server hostname="server1" more_attributes="more"/>
<server hostname="server2" more_attributes="more"/>
<server hostname="server3" more_attributes="more"/>
</main>
出力
- server1
- server2
- server3