Perl에 Hash는 없다???

2006-06-20   //   alexken작성   //   기술  //  3 Comments

Perl에서 array는

my @array = (1,2,3,4,5,6);

과 같이 정의하고 @를 앞에 붙여준다.
반면 hash는

my %capitals= ('china' => 'beijing', 'england' => 'london');

과 같이 정의하고 %를 붙여준다.

그리고 사용법은

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');

my @capitals= ('china' , 'beijing' , 'england' , 'london' );

즉 둘중 아무렇게나 선언한뒤
%capitals라 선언하고 @captitals처럼 사용해도 되고,
반대로 @captitals로 선언하고, 이후에 %capitals처럼 써도 된다.

하지만 후자처럼 사용할 경우, 홀수개의 인자를 가진 array를 hash처럼 사용했을때 어떤 sideeffect 가 있는지 알수 없음.

Perl하는 사람중에서 나만 몰랐던 내용인가???
넘 당연한 거였나???
암튼 재미난거 하나 알았다.