[첫화면으로]Perl/배열

마지막으로 [b]

1. 배열
2. 배열 관련 함수
3. slice
4. 배열과 리스트
4.1. Array vs List
4.2. 다른 문서들
5. 기타
6. Comments

1. 배열

@arr2 = @arr[1..3];            # arr 의 일부만 arr2 에 할당
@arr2 = ( @arr, $aaa, $bbb );  # arr 뒤에 원소를 추가하여 arr2 에 할당
( $name, $age, $home, $sex )  = @personal   # personal 의 각 원소를 차례대로 할당

주의:
$arr = "@arr";    # @arr 의 내용을 나열한 문자열.
                  # double quote 일 경우에 각 원소들은 스페이스, 정확히는 $"의 값으로 구분됨
$arr = @arr;      # @arr 의 원소의 갯수 ($#arr + 1)

($a, @dish) = @food;   # $a = $food[0], @dish = @food[1..$#food]
(@dish, $a) = @foot;   # @dish = @foot, $a 에는 할당되지 않음!

2. 배열 관련 함수

unshift @arr, "first";      # arr의 첫번째 원소 앞에 "first"를 삽입
$first = shift @arr;        # arr의 첫번째 원소를 반환하고 arr에서 제거

push (@arr, "last");        # arr의 마지막에 "last" 라는 값을 갖는 원소를 추가하며, 제일 마지막에 push 된 값을 반환
$last  = pop   @arr;        # arr의 마지막 원소를 반환하고 arr에서 제거

$str = join(':', @arr);     # arr의 원소들을 ":"으로 연결한 문자열 반환

@nsarray = sort @narray;    # narray 의 원소를 ascii 순으로 정렬하여 nsarray 에 할당

@entries = grep (/\.htm$/, readdir(HDir));  # 배열의 원소 중 특정 패턴에 일치하는 원소만 골라서 새로운 배열로 반환

# equivalences
push(@a,$x,$y)      splice(@a,@a,0,$x,$y)
pop(@a)             splice(@a,-1)
shift(@a)           splice(@a,0,1)
unshift(@a,$x,$y)   splice(@a,0,0,$x,$y)
$a[$i] = $y         splice(@a,$i,1,$y)

3. slice

list slice - 리스트도 배열처럼 인덱스를 줄 수 있다1
my $mtime = (stat $some_file)[9];          # scalar context
my ($first, $last) = (sort @names)[0, -1]; # list context
my @numbers = ( @names )[ 9, 0, 2, 1, 0 ]; # 역시 list context

array slice - 배열 변수의 슬라이스를 얻을 경우는 괄호 생략 가능2
my @numbers = @names[ 9, 0, 2, 1, 0 ];

@items[2, 3] = ($new_address, $new_home_phone);  # 슬라이스로의 할당도 가능

hash slice3
my @three_scores = ($score{"barney"}, $score{"fred"}, $score{"dino"});  # 이것 대신에 아래처럼
my @three_scores = @score{ qw/ barney fred dino/ };   # score의 prefix가 "@"인 것에 주의! 슬라이스는 언제나 리스트

# 슬라이스로의 할당
my @players = qw/ barney fred dino /;
my @bowling_scores = (195, 205, 30);
@score{ @players } = @bowling_scores;

4. 배열과 리스트

배열과 리스트는 다르다.

4.1. Array vs List

Perl에서, 리스트와 배열은 엄격히 말해서 서로 다르다. 비록 서로 바꿔 언급되곤 하지만 말이다.

내부적인 관점에서 배열은 대응되는 AV값이 있는 것이고, 그 말은 배열은 참조하거나 수정할 수 있다는 뜻이다. 리스트는 수정할 수 없는 값들의 집합이 스택에 임시로 구성된 것이다.

따라서 다음 코드에서
 @foo = ( $a, $b, $c );
등호의 좌변은 배열이고, 우변은 리스트이다.

배열의 레퍼런스를 취하면 배열의 레퍼런스가 담긴 스칼라가 나온다.
 my $array_ref = \@foo;

리스트의 레퍼런스를 취하면, 리스트의 원소들의 레퍼런스의 리스트가 나온다.
 my ($a_ref,$b_ref,$c_ref) = \( $a, $b, $c );

서브루틴의 인자는 보통은 리스트이다.
 fnorble( $a, $b, $c );

배열이 리스트 컨텍스트 안에서 사용되면 배열 내의 원소들의 리스트를 반환한다. 또한 서브루틴의 인자는 보통은 리스트 컨텍스트 안에 있기 때문에,
 fnorble( @foo );
위 구문은 보통은 @foo 자체가 아니라 @foo의 원소들의 리스트를 넘겨준다.

다소 혼란스러운 부분은 리스트의 원소와 배열의 원소를 동일한 표현을 써서 접근할 수 있다는 점이다:
 $b_copy = $foo[1];
 $b_copy = ($a,$b,$c)[1];
그러나 리스트는 항상 슬라이스 인덱싱을 사용하고 배열은 $ 대신에 @ 기호를 앞에 붙였을 때만 슬라이스 인덱싱을 사용한다:

sub index_value {
    if (wantarray) {
        print "this is list context\n";
        return (0, 1, 2);
    }
    print "this is scalar context\n";
    return 0;
}

my @array = (4, 5, 6);
print $array[index_value()], "\n";  #prints "this is scalar context\n4\n"
print @array[index_value()], "\n";  #prints "this is list context\n456\n"
print (4,5,6)[index_value()], "\n"; #prints "this is list context\n456\n"
# 원문에는 위와 같이 나와 있는데, 실제로는 print(4,5,6) 부분이 먼저 해석되므로 에러가 나온다.
print( (4,5,6)[index_value()], "\n" ); # 이렇게 전체를 괄호로 둘러싸야 함

그러나, 서브루틴을 리스트 컨텍스트 내에서 접근할 수 있고 따라서 다음과 같이 할 수 있다:
sub fnorble {
    # 넘겨받은 각 값에 1을 더해서 새로운 값들을 반환한다.
    my @return_values = map { $_ + 1 } @_;
    return @return_values;
}
my @foo    = (1, 2, 3, 4);
my $b_copy = (fnorble(@foo))[1]; #$b_copy 에는 리스트 (2,3,4,5)의 두번째 값인 3이 담긴다.

4.2. 다른 문서들

5. 기타

6. Comments

이름:  
Homepage:
내용:
 


컴퓨터분류
각주:
1. 2. 3. Learning Perl, Chapter 16

마지막 편집일: 2013-7-21 3:39 pm (변경사항 [d])
7103 hits | Permalink | 변경내역 보기 [h] | 페이지 소스 보기