Perl/List-Util 페이지의 소스 보기
마지막으로 [b]
-- Loading page list... --
내용출력
로그인[l]
Diary
[f]
최근변경내역
[r]
페이지목록[i]
횡설수설[2]
게시판[3]
링크
수정할 수 없습니다: Perl/List-Util 는 읽기 전용 페이지입니다.
== # perldoc List::Util 정리 == 원문: http://search.cpan.org/~gbarr/Scalar-List-Utils-1.23/lib/List/Util.pm === # 이름 === List::Util - 리스트를 다루는 일반적인 유틸리트들 모음 === # 개괄 === {{{#!vim perl use List::Util qw(first max maxstr min minstr reduce shuffle sum); }}} === # 설명 ===
List::Util
모듈은 디폴트로는 어느 서브루틴도 익스포트하지 않음. first BLOCK LIST : LIST의 원소를 하나씩 $_에 담은 후 BLOCK을 평가한다는 점에서
grep
과 유사. : BLOCK의 결과가 참이 되는 첫번째 원소를 반환 : BLOCK이 참이 되는 경우가 없거나 LIST가 비었을 경우 undef 반환 {{{#!vim perl $foo = first { defined($_) } @list # @list의 원소 중 정의된 첫번째 값 $foo = first { $_ > $value } @list # @list의 원소 중 $value보다 큰 첫번째 값 }}} : 이 함수는
reduce
를 사용하여 다음처럼 구현할 수도 있음 : 예를 들어 watend()자리에 defined()를 쓰면 정의된 첫 원소를 반환 {{{#!vim perl $foo = reduce { defined($a) ? $a : wanted($b) ? $b : undef } undef, @list }}} max LIST : 리스트의 원소 중 값이 (수로 간주했을 때) 제일 큰 원소를 반환. 리스트가 비었을 때는 undef 반환. {{{#!vim perl $foo = max 1..10 # 10 $foo = max 3,9,12 # 12 $foo = max @bar, @baz # whatever }}} :
reduce
를 사용해 다음처럼 구현할 수도 있음 {{{#!vim perl $foo = reduce { $a > $b ? $a : $b } 1..10 }}} maxstr LIST : 리스트의 원소를 문자열로 간주하여
gt
연산자로 비교했을 때 값이 가장 큰 원소를 반환. 리스트가 비었으면 undef 반환. {{{#!vim perl $foo = maxstr 'A'..'Z' # 'Z' $foo = maxstr "hello","world" # "world" $foo = maxstr @bar, @baz # whatever }}} :
reduce
를 사용해 다음처럼 구현할 수도 있음 {{{#!vim perl $foo = reduce { $a gt $b ? $a : $b } 'A'..'Z' }}} min LIST :
max
와 유사하게, 가장 값이 작은 수를 반환. 리스트가 비었으면 undef 반환. {{{#!vim perl $foo = min 1..10 # 1 $foo = min 3,9,12 # 3 $foo = min @bar, @baz # whatever }}} :
reduce
를 사용해 다음처럼 구현할 수도 있음 {{{#!vim perl $foo = reduce { $a < $b ? $a : $b } 1..10 }}} minstr LIST : 리스트의 원소를 문자열로 간주하여
lt
연산자로 비교했을 때 값이 가장 작은 원소를 반환. 리스트가 비었으면 undef 반환. {{{#!vim perl $foo = minstr 'A'..'Z' # 'A' $foo = minstr "hello","world" # "hello" $foo = minstr @bar, @baz # whatever }}} :
reduce
를 사용해 다음처럼 구현할 수도 있음 {{{#!vim perl $foo = reduce { $a lt $b ? $a : $b } 1..10 }}} reduce BLOCK LIST :
$a
와
$b
를 매번 세팅하면서 BLOCK을 스칼라 문맥에서 호출하여 LIST를 줄임 : 첫번째 호출에서는 $a와 $b는 리스트의 처음 두 원소가 들어가고, 그 다음 호출부터는 $a는 이전 호출의 결과가 들어가고 $b는 리스트의 다음 원소가 들어감 : 마지막 호출의 결과를 반환. LIST가 비었으면 undef 반환. LIST에 원소가 하나 뿐이면 그 원소를 반환하며 BLOCK은 호출되지 않음 {{{#!vim perl $foo = reduce { $a < $b ? $a : $b } 1..10 # min $foo = reduce { $a lt $b ? $a : $b } 'aa'..'zz' # minstr $foo = reduce { $a + $b } 1 .. 10 # sum $foo = reduce { $a . $b } @bar # concat }}} : 식별값
을 생성하길 원한다면 그 값을 첫번째 인자로 주어서 undef이 반환되는 일이 없도록 하라. {{{#!vim perl $foo = reduce { $a + $b } 0, @values; # sum with 0 identity value }}} shuffle LIST : LIST의 원소의 순서를 랜덤하게 섞어 반환 {{{#!vim perl @cards = shuffle 0..51 # 0..51 in a random order }}} sum LIST : LIST의 원소의 합을 반환. 리스트가 비었으면 undef 반환 {{{#!vim perl $foo = sum 1..10 # 55 $foo = sum 3,9,12 # 24 $foo = sum @bar, @baz # whatever }}} :
reduce
를 사용해 다음처럼 구현할 수도 있음 {{{#!vim perl $foo = reduce { $a + $b } 1..10 }}} :
sum
이 식별값 0을 생성하길 원한다면 첫번째 인자로 0을 넘겨서, undef이 반환되는 일이 없도록 할 것. {{{#!vim perl $foo = sum 0, @values; }}} === # 알려진 버그 === (5.005 이전 버전 얘기라 생략) === # 제안된 추가사항들 === 이 모듈에 추가되었으면 좋겠다는 요청을 받았으나, perl에서 구현하기 매우 간단하기 때문에 따로 추가하지 않은 함수들 {{{#!vim perl # 참인 원소가 하나 이상 있는지 sub any { $_ && return 1 for @_; 0 } # 모든 원소가 참인지 sub all { $_ || return 0 for @_; 1 } # 모든 원소가 거짓인지 sub none { $_ && return 0 for @_; 1 } # 거짓인 원소가 하나 이상 있는지 sub notall { $_ || return 1 for @_; 0 } # 참인 원소의 갯수 sub true { scalar grep { $_ } @_ } # 거짓인 원소의 갯수 sub false { scalar grep { !$_ } @_ } }}} === # 참고 === Perldoc:Scalar::Util""
, Cpan:List::MoreUtils""
=== # COPYRIGHT === (생략) == # 기타 == === # reduce 사용시 $a, $b 에 대한 used once 경고 === List::Util 의
reduce
또는 [[/List-MoreUtils]]의
pairwise
를 쓸 경우 $a,$b 변수가 한번만 쓰이고 있다는 경고가 뜰 수 있음. {{{#!vim perl use List::Util qw/reduce/; print reduce { $a * $b } 1..6; }}} {{{#!vim Name "main::a" used only once: possible typo at x.pl line 6. Name "main::b" used only once: possible typo at x.pl line 6. }}}
sort
의 경우는 빌트인 함수라서 괜찮은데, 외부 함수는 이 문제를 깔끔하게 없앨 수 없었던 듯하다. 어쨌거나 저 경고가 뜨지 않게 하려면 1)
no warnings 'once'
를 해서 아예 경고를 끄던가 (아무래도 기분 나쁘다) 2) 스크립트 내에서 $a와 $b가 한 번 이상 더 쓰인다면야 경고가 뜰 일이 아예 없을 거고 3)
our
로 미리 선언해주든가, 저 익명 서브루틴 안에서 선언할 수도 있다. {{{#!vim perl use List::Util qw/reduce/; our ($a, $b); print reduce { $a * $b } 1..6; # 또는 print reduce { our($a,$b); $a * $b } 1..6; # 이렇게도 가능 - 이게 깔끔해 보인다? print reduce { our $a * our $b } 1..6; }}} 참고: * [http://www.perlmonks.org/?node_id=1021888 Name "main::a" used only once: possible typo -- Perl Monks] * [http://stackoverflow.com/questions/1490505/how-do-i-prevent-listmoreutils-from-warning-about-using-a-and-b-only-once perl - How do I prevent List::MoreUtils from warning about using $a and $b only once? - Stack Overflow] == # Comments ==
----
---- [[컴퓨터분류]] [[Perl]]
Perl/List-Util
페이지로 돌아가기 |
다른 수정본 보기