100만원 어치 책 CapsLock을 Ctrl로…

Perl에 Hash는 없다???


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하는 사람중에서 나만 몰랐던 내용인가???
넘 당연한 거였나???
암튼 재미난거 하나 알았다.


토론, 답글이 시작되었습니다

  1. alexken, August 6th, 2008 at 3:36 pm

    http://aero.dnip.net/blog/2008/03/perl-hash.html 에 나의 음모론에 대한 정답이 있는 듯하다.

    즉 perl interpreter가 Hash와 Array의 내부구조가 같으면서 사용자에게 다른것 처럼 속이는게 아니라,
    서로 카피가 일어나거나 서브루틴으로 넘어갈때, platten이 일어나서 그런거라면 모든게 깔끔히 설명된다.

  • 이 댓글 RSS를 통해 새로 올라오는 댓글을 구독할수 있습니다.
    트랙백으로 답글을 보내시려면 아래의 트랙백주소를 사용해 주세요.
    http://hanury.net/wp/archives/111/trackback