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


Answers

쉬운:

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

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

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

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

while 루프를 사용하지 않으면 가장 좋습니다 (예 : one-liner 가 가장 좋습니다).




대답은 해쉬가 무엇인지에 달려 있습니다. 간단한 해시를 가지고 있다면 간단합니다.

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

또는

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

참조로 채워진 해시가 있으면 해당 참조를 걸을 수 있고 현명한 결과를 낼 수 있습니다. 이 참조를 걷는 것을 일반적으로 직렬화라고합니다. 다양한 스타일을 구현하는 모듈이 많이 있지만, 인기있는 모듈 중 일부는 다음과 같습니다.

Data::Dumper 가 핵심 Perl 라이브러리의 일부이기 때문에 아마도 가장 인기가 있습니다. 그러나 다른 모듈들 중 일부는 매우 좋은 것들을 제공합니다.




제 경험에서 가장 쉬운 방법은 Dumpvalue 값을 사용하는 Dumpvalue 입니다.

use Dumpvalue;
...
my %hash = { key => "value", foo => "bar" };
my $dumper = new DumpValue();
$dumper->dumpValue(\%hash);

매력처럼 작동하고 해시를 형식화하는 것에 대해 걱정할 필요가 없습니다. Perl 디버거처럼 출력하므로 디버깅에 좋습니다. 게다가, Dumpvalue는 Perl 모듈 세트에 포함되어 있습니다. 내가 일하고있는 것처럼 혹독한 프록시의 일종이라면 CPAN을 망칠 필요가 없습니다.




해시의 모든 요소에 대해 하나의 공간을 추가하여 잘 볼 수 있습니다.

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



디버깅 목적으로 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"
    }
}