-
- 1. perldoc List::Util 정리
-
-
- 1.1. 이름
-
- 1.2. 개괄
-
- 1.3. 설명
-
- 1.4. 알려진 버그
-
- 1.5. 제안된 추가사항들
-
- 1.6. 참고
-
- 1.7. COPYRIGHT
-
2. 기타
-
-
- 2.1. reduce 사용시 $a, $b 에 대한 used once 경고
-
3. Comments
-
1. perldoc List::Util 정리
원문: http://search.cpan.org/~gbarr/Scalar-List-Utils-1.23/lib/List/Util.pm
List::Util - 리스트를 다루는 일반적인 유틸리트들 모음
use List::Util qw(first max maxstr min minstr reduce shuffle sum);
List::Util
모듈은 디폴트로는 어느 서브루틴도 익스포트하지 않음.
first BLOCK LIST
- LIST의 원소를 하나씩 $_에 담은 후 BLOCK을 평가한다는 점에서
grep
과 유사.
- BLOCK의 결과가 참이 되는 첫번째 원소를 반환
- BLOCK이 참이 되는 경우가 없거나 LIST가 비었을 경우 undef 반환
$foo = first { defined($_) } @list
$foo = first { $_ > $value } @list
- 이 함수는
reduce
를 사용하여 다음처럼 구현할 수도 있음
- 예를 들어 watend()자리에 defined()를 쓰면 정의된 첫 원소를 반환
$foo = reduce { defined($a) ? $a : wanted($b) ? $b : undef } undef, @list
max LIST
- 리스트의 원소 중 값이 (수로 간주했을 때) 제일 큰 원소를 반환. 리스트가 비었을 때는 undef 반환.
$foo = max 1..10
$foo = max 3,9,12
$foo = max @bar, @baz
-
reduce
를 사용해 다음처럼 구현할 수도 있음
$foo = reduce { $a > $b ? $a : $b } 1..10
maxstr LIST
- 리스트의 원소를 문자열로 간주하여
gt
연산자로 비교했을 때 값이 가장 큰 원소를 반환. 리스트가 비었으면 undef 반환.
$foo = maxstr 'A'..'Z'
$foo = maxstr "hello","world"
$foo = maxstr @bar, @baz
-
reduce
를 사용해 다음처럼 구현할 수도 있음
$foo = reduce { $a gt $b ? $a : $b } 'A'..'Z'
min LIST
-
max
와 유사하게, 가장 값이 작은 수를 반환. 리스트가 비었으면 undef 반환.
$foo = min 1..10
$foo = min 3,9,12
$foo = min @bar, @baz
-
reduce
를 사용해 다음처럼 구현할 수도 있음
$foo = reduce { $a < $b ? $a : $b } 1..10
minstr LIST
- 리스트의 원소를 문자열로 간주하여
lt
연산자로 비교했을 때 값이 가장 작은 원소를 반환. 리스트가 비었으면 undef 반환.
$foo = minstr 'A'..'Z'
$foo = minstr "hello","world"
$foo = minstr @bar, @baz
-
reduce
를 사용해 다음처럼 구현할 수도 있음
$foo = reduce { $a lt $b ? $a : $b } 1..10
reduce BLOCK LIST
-
$a
와 $b
를 매번 세팅하면서 BLOCK을 스칼라 문맥에서 호출하여 LIST를 줄임
- 첫번째 호출에서는 $a와 $b는 리스트의 처음 두 원소가 들어가고, 그 다음 호출부터는 $a는 이전 호출의 결과가 들어가고 $b는 리스트의 다음 원소가 들어감
- 마지막 호출의 결과를 반환. LIST가 비었으면 undef 반환. LIST에 원소가 하나 뿐이면 그 원소를 반환하며 BLOCK은 호출되지 않음
$foo = reduce { $a < $b ? $a : $b } 1..10
$foo = reduce { $a lt $b ? $a : $b } 'aa'..'zz'
$foo = reduce { $a + $b } 1 .. 10
$foo = reduce { $a . $b } @bar
- 식별값을 생성하길 원한다면 그 값을 첫번째 인자로 주어서 undef이 반환되는 일이 없도록 하라.
$foo = reduce { $a + $b } 0, @values;
shuffle LIST
- LIST의 원소의 순서를 랜덤하게 섞어 반환
@cards = shuffle 0..51
sum LIST
- LIST의 원소의 합을 반환. 리스트가 비었으면 undef 반환
$foo = sum 1..10
$foo = sum 3,9,12
$foo = sum @bar, @baz
-
reduce
를 사용해 다음처럼 구현할 수도 있음
$foo = reduce { $a + $b } 1..10
-
sum
이 식별값 0을 생성하길 원한다면 첫번째 인자로 0을 넘겨서, undef이 반환되는 일이 없도록 할 것.
$foo = sum 0, @values;
(5.005 이전 버전 얘기라 생략)
1.5. 제안된 추가사항들
이 모듈에 추가되었으면 좋겠다는 요청을 받았으나, 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 { !$_ } @_ }
Scalar::Util, List::MoreUtils
1.7. COPYRIGHT
(생략)
2.1. reduce 사용시 $a, $b 에 대한 used once 경고
List::Util 의 reduce
또는 /List-MoreUtils의 pairwise
를 쓸 경우 $a,$b 변수가 한번만 쓰이고 있다는 경고가 뜰 수 있음.
use List::Util qw/reduce/;
print reduce { $a * $b } 1..6;
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
로 미리 선언해주든가, 저 익명 서브루틴 안에서 선언할 수도 있다.
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;
참고:
3. Comments
컴퓨터분류 Perl