[perl] Perl에서 해시의 내용을 어떻게 인쇄 할 수 있습니까?

# 버킷 수 / # 할당으로 해시를 계속 인쇄합니다. 해시의 내용을 어떻게 인쇄합니까?

while루프를 사용하지 않는 것이 가장 좋습니다 (예를 들어, 한 줄짜리 가 가장 좋습니다).



답변

Data :: Dumper 는 당신의 친구입니다.

use Data::Dumper;
my %hash = ('abc' => 123, 'def' => [4,5,6]);
print Dumper(\%hash);

출력합니다

$VAR1 = {
          'def' => [
                     4,
                     5,
                     6
                   ],
          'abc' => 123
        };


답변

쉬운:

print "$_ $h{$_}\n" for (keys %h);

우아하지만 실제로 30 % 더 느립니다 (!) :

while (my ($k,$v)=each %h){print "$k $v\n"}


답변

사용하지 않고 인쇄하는 방법 Data::Dumper

print "@{[%hash]}";


답변

디버깅 목적으로 자주 사용 YAML합니다.

use strict;
use warnings;

use YAML;

my %variable = ('abc' => 123, 'def' => [4,5,6]);

print "# %variable\n", Dump \%variable;

결과 :

# %variable
---
abc: 123
def:
  - 4
  - 5
  - 6

다른 때는 사용하겠습니다 Data::Dump. 변수를 원하는 것보다 멋진 형식으로 출력하기 위해 많은 변수를 설정할 필요는 없습니다 Data::Dumper.

use Data::Dump = 'dump';

print dump(\%variable), "\n";
{ abc => 123, def => [4, 5, 6] }

더 최근에는 Data::Printer디버깅 에 사용 했습니다.

use Data::Printer;
p %variable;
{
    abc   123,
    def   [
        [0] 4,
        [1] 5,
        [2] 6
    ]
}

(결과는 터미널에서 훨씬 더 화려한 수 있습니다)

여기에 표시된 다른 예와 달리이 예는 표시 용으로 만 명시 적으로 설계되었습니다. 연결된 변수 또는 객체의 구조를 덤프하면 더 쉽게 나타납니다.

use strict;
use warnings;

use MTie::Hash;
use Data::Printer;

my $h = tie my %h, "Tie::StdHash";
@h{'a'..'d'}='A'..'D';
p %h;
print "\n";
p $h;
{
    a   "A",
    b   "B",
    c   "C",
    d   "D"
} (tied to Tie::StdHash)

Tie::StdHash  {
    public methods (9) : CLEAR, DELETE, EXISTS, FETCH, FIRSTKEY, NEXTKEY, SCALAR, STORE, TIEHASH
    private methods (0)
    internals: {
        a   "A",
        b   "B",
        c   "C",
        d   "D"
    }
}


답변

대답은 해시의 내용에 따라 다릅니다. 간단한 해시를 가지고 있다면

print map { "$_ $h{$_}\n" } keys %h;

또는

print "$_ $h{$_}\n" for keys %h;

그러나 참조로 채워진 해시가 있으면 해당 참조를 걸고 합리적인 출력을 생성 할 수있는 무언가가 생깁니다. 이러한 참조를 일반적으로 직렬화라고합니다. 다른 스타일을 구현하는 많은 모듈이 있으며, 가장 많이 사용되는 모듈은 다음과 같습니다.

사실로 인해 Data::Dumper핵심 펄 라이브러리의 일부입니다, 아마 가장 인기가있다; 그러나 다른 모듈 중 일부는 제공 할만한 좋은 기능이 있습니다.


답변

내가 좋아하는 것 : Smart :: Comments

use Smart::Comments;
# ...

### %hash

그게 다야.


답변

루핑 :

foreach(keys %my_hash) { print "$_ / $my_hash{$_}\n"; }

기능의

map {print "$_ / $my_hash{$_}\n"; } keys %my_hash;

그러나 순전히 우아함을 위해서는 wrang-wrang ‘s를 선택해야합니다. 내 코드의 경우 foreach를 선택합니다. 또는 tetro의 덤퍼 사용.