-
- 1. 배열
-
- 2. 배열 관련 함수
-
- 3. slice
-
- 4. 배열과 리스트
-
-
- 4.1. Array vs List
-
- 4.2. 다른 문서들
-
5. 기타
-
- 6. Comments
-
- 배열의 index 는 0 부터 시작한다.
- 배열의 마지막 index 는 $#배열명 으로 참조할 수 있다.
- @배열[시작index..끝index] - 독립적인 배열로 취급
- $#배열명 값을 임의로 할당함으로써 배열의 크기를 조절할 수 있다.
@arr2 = @arr[1..3];
@arr2 = ( @arr, $aaa, $bbb );
( $name, $age, $home, $sex ) = @personal
주의:
-
$arr = "@arr";
$arr = @arr;
($a, @dish) = @food;
(@dish, $a) = @foot;
2. 배열 관련 함수
- unshift, shift, push, pop
unshift @arr, "first";
$first = shift @arr;
push (@arr, "last");
$last = pop @arr;
$str = join(':', @arr);
@nsarray = sort @narray;
@entries = grep (/\.htm$/, readdir(HDir));
- splice ARRAY, OFFSET, LENGTH, LIST
- ARRAY에 OFFSET부터 LENGTH개의 원소들을 제거하고 그 자리를 LIST로 채워넣음
- 리스트 컨택스트에서 제거된 원소들을, 스칼라 컨택스트에서 제거된 마지막 원소를 반환
- LIST가 생략되면 제거만
- OFFSET이 음수면 ARRAY의 끝에서부터 센다
- LENGTH가 생략되면 OFFSET부터 끝까지 제거
- LENGTH가 음수이면, OFFSET부터 시작해서 ARRAY의 마지막 -LENGTH개의 원소를 남기고 제거
- OFFSET과 LENGHT가 다 생략되면 모든 원소를 제거
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 - 리스트도 배열처럼 인덱스를 줄 수 있다
my $mtime = (stat $some_file)[9];
my ($first, $last) = (sort @names)[0, -1];
my @numbers = ( @names )[ 9, 0, 2, 1, 0 ];
array slice - 배열 변수의 슬라이스를 얻을 경우는 괄호 생략 가능
my @numbers = @names[ 9, 0, 2, 1, 0 ];
@items[2, 3] = ($new_address, $new_home_phone);
hash slice
my @three_scores = ($score{"barney"}, $score{"fred"}, $score{"dino"});
my @three_scores = @score{ qw/ barney fred dino/ };
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이 담긴다.
6. Comments
컴퓨터분류