Perl/배열 페이지의 소스 보기
마지막으로 [b]
-- Loading page list... --
내용출력
로그인[l]
Diary
[f]
최근변경내역
[r]
페이지목록[i]
횡설수설[2]
게시판[3]
링크
수정할 수 없습니다: Perl/배열 는 읽기 전용 페이지입니다.
== # 배열 == * 배열의 index 는 0 부터 시작한다. * 배열의 마지막 index 는 $#배열명 으로 참조할 수 있다. * @배열[시작index..끝index] - 독립적인 배열로 취급 * $#배열명 값을 임의로 할당함으로써 배열의 크기를 조절할 수 있다. {{{#!vim perl @arr2 = @arr[1..3]; # arr 의 일부만 arr2 에 할당 @arr2 = ( @arr, $aaa, $bbb ); # arr 뒤에 원소를 추가하여 arr2 에 할당 ( $name, $age, $home, $sex ) = @personal # personal 의 각 원소를 차례대로 할당 }}} 주의: : {{{#!vim perl $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 에는 할당되지 않음! }}} == # 배열 관련 함수 == * unshift, shift, push, pop {{{#!vim perl 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)); # 배열의 원소 중 특정 패턴에 일치하는 원소만 골라서 새로운 배열로 반환 }}} ** Perl 5.14 부터는 이름있는 배열 뿐 아니라 배열 레퍼런스를 인자로 줄 수도 있다. (이전 버전에서는 컴파일 에러) (출처: [http://www.effectiveperlprogramming.com/blog/756 Use array references with the array operators | The Effective Perler]) * splice ARRAY, OFFSET, LENGTH, LIST ** ARRAY에 OFFSET부터 LENGTH개의 원소들을 제거하고 그 자리를 LIST로 채워넣음 ** 리스트 컨택스트에서 제거된 원소들을, 스칼라 컨택스트에서 제거된 마지막 원소를 반환 ** LIST가 생략되면 제거만 ** OFFSET이 음수면 ARRAY의 끝에서부터 센다 ** LENGTH가 생략되면 OFFSET부터 끝까지 제거 ** LENGTH가 음수이면, OFFSET부터 시작해서 ARRAY의 마지막 -LENGTH개의 원소를 남기고 제거 ** OFFSET과 LENGHT가 다 생략되면 모든 원소를 제거 {{{#!vim perl # 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) }}} * reverse - 역순으로 된 리스트 반환 * sort - 정렬. 기본동작은 ASCII == # slice == list slice - 리스트도 배열처럼 인덱스를 줄 수 있다
{{{#!vim perl 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 - 배열 변수의 슬라이스를 얻을 경우는 괄호 생략 가능
{{{#!vim perl my @numbers = @names[ 9, 0, 2, 1, 0 ]; @items[2, 3] = ($new_address, $new_home_phone); # 슬라이스로의 할당도 가능 }}} hash slice
{{{#!vim perl 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; }}} == # 배열과 리스트 == 배열과 리스트는 다르다. === # Array vs List === * 원문 [http://www.socialtext.net/perl5/index.cgi?array_vs_list array vs list / Perl 5 Wiki] 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이 담긴다. }}} === # 다른 문서들 === * [[/Perlfaq4-List-and-Array]] * [http://japhy.perlmonk.org/articles/pm/2000-02.html "List" Is a Four-Letter Word -- PerlMonth - "Coding with Style"] * [http://friedo.com/blog/2013/07/arrays-vs-lists-in-perl Arrays vs. Lists in Perl: What's the Difference? - in scalar context] == # 기타 == * [[/List-Util]] * [[/List-MoreUtils]] * [http://ko.perlmaven.com/unique-values-in-an-array-in-perl 배열에서 고유 값들만 남기기 -- Perl Maven] * [http://ko.perlmaven.com/undef-on-perl-arrays-and-hashes Perl 배열과 해시에 대한 undef 호출] == # Comments ==
---- [[컴퓨터분류]]
Perl/배열
페이지로 돌아가기 |
다른 수정본 보기