답변:
Data :: Dumper 는 당신의 친구입니다.
use Data::Dumper;
my %hash = ('abc' => 123, 'def' => [4,5,6]);
print Dumper(\%hash);
출력합니다
$VAR1 = {
'def' => [
4,
5,
6
],
'abc' => 123
};
&
는 C 및 C ++ 의 연산자 와 같은 참조를 만듭니다 . 이 문맥에서 중요한 이유는 Perl에서 해시 값을 인수로 사용하여 함수를 호출하면 해시 값이 나열되어 여러 인수로 확장되기 때문 %hsh=("a" => 1, "b" => 2); foo(%hsh);
입니다 foo("a", 1, "b", 2)
. : 대신 함수가 해시 자체에서 작동하려면 해시에 대한 참조를 전달해야 foo(\%hsh);
참조 perldoc.perl.org/perlsub.html#Pass-by-Reference
쉬운:
print "$_ $h{$_}\n" for (keys %h);
우아하지만 실제로 30 % 더 느립니다 (!) :
while (my ($k,$v)=each %h){print "$k $v\n"}
print "$_ $h{$_}\n" for (keys %h);
, $k
그 예에 존재하지 않습니다.
for
루프는 빠르게보다 while
: 적어도 10,000 키까지 gist.github.com/151792
사용하지 않고 인쇄하는 방법 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
핵심 펄 라이브러리의 일부입니다, 아마 가장 인기가있다; 그러나 다른 모듈 중 일부는 제공 할만한 좋은 기능이 있습니다.
use
Smart::Comments
그 관점에서도 볼 수 있습니다. 그러나 카운터에 Smart::Comments
대해서는 범위 가 지정된 모듈 로 잘 작동하므로 SC 를 사용 하지 않는 모듈에는 출력 동작이 없어야합니다 . 따라서 문제는 use 문을 사용 하여 해당 범위로 격리됩니다 . 유지 보수 프로그래머가 포함 된 모듈에 대한 문서를 읽을 책임이 없다고 말하는 경우에는 동의하지 않습니다. 댓글을 주셔서 감사합니다
루핑 :
foreach(keys %my_hash) { print "$_ / $my_hash{$_}\n"; }
기능의
map {print "$_ / $my_hash{$_}\n"; } keys %my_hash;
그러나 순전히 우아함을 위해서는 wrang-wrang 's를 선택해야합니다. 내 코드의 경우 foreach를 선택합니다. 또는 tetro의 덤퍼 사용.
foreach
하고 map
. map
A에 대한 루프 에뮬레이트되지 공극 맥락에서, 목록 변환에 대한 표기
내 경험에서 가장 쉬운 방법은 Dumpvalue 만 사용하는 것 입니다.
use Dumpvalue;
...
my %hash = { key => "value", foo => "bar" };
my $dumper = new DumpValue();
$dumper->dumpValue(\%hash);
매력처럼 작동하며 Perl 디버거가 출력하는 것처럼 해시 형식을 지정할 필요가 없습니다 (디버깅에 적합). 또한 Dumpvalue는 Perl 모듈의 스톡 세트에 포함되어 있으므로 어떤 종류의 draconian 프록시를 사용하고 있다면 CPAN을 망칠 필요가 없습니다.
당신이 pedantic하고 싶어하고 (사용 진술과 shebang없이) 한 줄로 유지하려면, 나는 tetromino의 대답에서 일종의 돼지를 다시 제안하고 제안 할 것입니다 :
print Dumper( { 'abc' => 123, 'def' => [4,5,6] } );
임시 변수를 건너 뛰기 위해 익명 해시를 사용하는 것 외에는 특별한 일을하지 않습니다.)