1

私はハッシュの配列を作成しようとしています。各ハッシュは結び付けられ、順序付けられたIxHashになっています。私の最初のハッシュをループするとき、キーは確かに正しいです。ただし、それらを配列にプッシュするとすぐに、順序が消えます。これは、ハッシュが配列にプッシュされたときにハッシュで何が起こっているのかについての私の知識が乏しいことを知っていますが、誰かが私を啓発することができれば、それは大いにありがたいです。

#! /usr/bin/perl -w

use strict;
use Data::Dumper;
use Tie::IxHash;

my @portinfo;

tie (my %portconfig, 'Tie::IxHash',
      'name' => [ 'Name', 'whatever' ],
      'port' => [ 'Port', '12345' ],
      'secure' => [ 'Secure', 'N' ]
      );

print "Dump of hash\n";
print Dumper(%portconfig);

print "\nDump of array\n";
push @portinfo, {%portconfig}; 
print Dumper(@portinfo);

これの出力:-

Dump of hash
$VAR1 = 'name';
$VAR2 = [
          'Name',
          'whatever'
        ];
$VAR3 = 'port';
$VAR4 = [
          'Port',
          '12345'
        ];
$VAR5 = 'secure';
$VAR6 = [
          'Secure',
          'N'
        ];

Dump of array
$VAR1 = {
          'secure' => [
                        'Secure',
                        'N'
                      ],
          'name' => [
                      'Name',
                      'whatever'
                    ],
          'port' => [
                      'Port',
                      '12345'
                    ]
        };
4

1 に答える 1

6

あなたのコード:

push @portinfo, {%portconfig}; 
print Dumper(@portinfo);

関連付けられたハッシュ%portconfigを取得し、その内容を新しい匿名ハッシュに配置します。このハッシュは次ににプッシュされ@portinfoます。したがって、配列には匿名の順序付けされていないハッシュがあります。

あなたがおそらくやろうとしていることは

push @portinfo, \%portconfig; 
print Dumper(@portinfo);

これにより、への参照がにプッシュさ%portconfig@portinfo、必要な順序が保持されます。

したがって:

#! /usr/bin/perl -w

use strict;
use Data::Dumper;
use Tie::IxHash;

my @portinfo;

tie (my %portconfig, 'Tie::IxHash',
      'name' => [ 'Name', 'whatever' ],
      'port' => [ 'Port', '12345' ],
      'secure' => [ 'Secure', 'N' ]
      );

print "Dump of hash\n";
print Dumper(%portconfig);

print "\nDump of array\n";
push @portinfo, \%portconfig; 
print Dumper(@portinfo);

与える

C:\demos>perl demo.pl
Dump of hash
$VAR1 = 'name';
$VAR2 = [
          'Name',
          'whatever'
        ];
$VAR3 = 'port';
$VAR4 = [
          'Port',
          '12345'
        ];
$VAR5 = 'secure';
$VAR6 = [
          'Secure',
          'N'
        ];

Dump of array
$VAR1 = {
          'name' => [
                      'Name',
                      'whatever'
                    ],
          'port' => [
                      'Port',
                      '12345'
                    ],
          'secure' => [
                        'Secure',
                        'N'
                      ]
        };
于 2012-08-06T15:21:49.137 に答える