Perl에 Hash는 없다???
Filed in: Computer Add comments
Perl에서 array는
my @array = (1,2,3,4,5,6);
과 같이 정의하고 @를 앞에 붙여준다.
반면 hash는
my %capitals= ('china' => 'beijing', 'england' => 'london', 'france' => 'paris');
과 같이 정의하고 %를 붙여준다.
그리고 사용법은
my $a = $capitals{'china'};
$key로 $value 값을 읽어오는 문법이니, 영락없이 Java의 Hash Class같은 놈으로 생각하고 만 있었다…..
(array of ($key -> $val )) : 즉 각각의 $val을 refer하는 $key의 array
하지만 오늘 회사에서 perl로 hash를 함수의 인자로 넘기는데, 안넘어 가는 것이었다.
sub getHash(%){ my %hash = %_; while ( my ($key, $val) = each (%hash)){} }
가 안되는 것이다.
책을 뒤져봤는데도 없었다.
왜일까???
정답은 모든 Array와 Hash를 출력하는 두개의 함수를 보면 알수 있다.
use strict; sub printHash(@){ my %h = @_; while ( my ($key, $val) = each (%h)) { print $key, " => ", $val, "\n"; } } sub printArray(@){ my @a = @_; print join("\n" , @a); print "\n"; }
그랬다. Perl에서 Hash는 Arrary 그 자체였다.
my %capitals= ('china' => 'beijing', 'england' => 'london', 'france' => 'paris'); my @capitals= ('china' , 'beijing' , 'england' , 'london' , 'france' , 'paris');
즉 둘중 아무렇게나 선언한뒤
%capitals라 선언하고 @captitals처럼 사용해도 되고,
반대로 @captitals로 선언하고, 이후에 %capitals처럼 써도 된다.
하지만 후자처럼 사용할 경우, 홀수개의 인자를 가진 array를 hash처럼 사용했을때 어떤 sideeffect 가 있는지 알수 없음.
Perl하는 사람중에서 나만 몰랐던 내용인가???
넘 당연한 거였나???
암튼 재미난거 하나 알았다.
http://aero.dnip.net/blog/2008/03/perl-hash.html 에 나의 음모론에 대한 정답이 있는 듯하다.
즉 perl interpreter가 Hash와 Array의 내부구조가 같으면서 사용자에게 다른것 처럼 속이는게 아니라,
서로 카피가 일어나거나 서브루틴으로 넘어갈때, platten이 일어나서 그런거라면 모든게 깔끔히 설명된다.