[첫화면으로]Perl/List-Util

마지막으로 [b]

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

1.1. 이름

List::Util - 리스트를 다루는 일반적인 유틸리트들 모음

1.2. 개괄

    use List::Util qw(first max maxstr min minstr reduce shuffle sum);

1.3. 설명

List::Util 모듈은 디폴트로는 어느 서브루틴도 익스포트하지 않음.

 first BLOCK LIST

LIST의 원소를 하나씩 $_에 담은 후 BLOCK을 평가한다는 점에서 grep과 유사.
BLOCK의 결과가 참이 되는 첫번째 원소를 반환
BLOCK이 참이 되는 경우가 없거나 LIST가 비었을 경우 undef 반환
    $foo = first { defined($_) } @list    # @list의 원소 중 정의된 첫번째 값
    $foo = first { $_ > $value } @list    # @list의 원소 중 $value보다 큰 첫번째 값
이 함수는 reduce를 사용하여 다음처럼 구현할 수도 있음
예를 들어 watend()자리에 defined()를 쓰면 정의된 첫 원소를 반환
    $foo = reduce { defined($a) ? $a : wanted($b) ? $b : undef } undef, @list

 max LIST

리스트의 원소 중 값이 (수로 간주했을 때) 제일 큰 원소를 반환. 리스트가 비었을 때는 undef 반환.
    $foo = max 1..10                # 10
    $foo = max 3,9,12               # 12
    $foo = max @bar, @baz           # whatever
reduce를 사용해 다음처럼 구현할 수도 있음
    $foo = reduce { $a > $b ? $a : $b } 1..10

 maxstr LIST

리스트의 원소를 문자열로 간주하여 gt연산자로 비교했을 때 값이 가장 큰 원소를 반환. 리스트가 비었으면 undef 반환.
    $foo = maxstr 'A'..'Z'          # 'Z'
    $foo = maxstr "hello","world"   # "world"
    $foo = maxstr @bar, @baz        # whatever
reduce를 사용해 다음처럼 구현할 수도 있음
    $foo = reduce { $a gt $b ? $a : $b } 'A'..'Z'

 min LIST

max와 유사하게, 가장 값이 작은 수를 반환. 리스트가 비었으면 undef 반환.
    $foo = min 1..10                # 1
    $foo = min 3,9,12               # 3
    $foo = min @bar, @baz           # whatever
reduce를 사용해 다음처럼 구현할 수도 있음
    $foo = reduce { $a < $b ? $a : $b } 1..10

 minstr LIST

리스트의 원소를 문자열로 간주하여 lt연산자로 비교했을 때 값이 가장 작은 원소를 반환. 리스트가 비었으면 undef 반환.
    $foo = minstr 'A'..'Z'          # 'A'
    $foo = minstr "hello","world"   # "hello"
    $foo = minstr @bar, @baz        # whatever
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       # min
    $foo = reduce { $a lt $b ? $a : $b } 'aa'..'zz' # minstr
    $foo = reduce { $a + $b } 1 .. 10               # sum
    $foo = reduce { $a . $b } @bar                  # concat
식별값1을 생성하길 원한다면 그 값을 첫번째 인자로 주어서 undef이 반환되는 일이 없도록 하라.
  $foo = reduce { $a + $b } 0, @values;             # sum with 0 identity value

 shuffle LIST

LIST의 원소의 순서를 랜덤하게 섞어 반환
    @cards = shuffle 0..51      # 0..51 in a random order

 sum LIST

LIST의 원소의 합을 반환. 리스트가 비었으면 undef 반환
    $foo = sum 1..10                # 55
    $foo = sum 3,9,12               # 24
    $foo = sum @bar, @baz           # whatever
reduce를 사용해 다음처럼 구현할 수도 있음
    $foo = reduce { $a + $b } 1..10
sum이 식별값 0을 생성하길 원한다면 첫번째 인자로 0을 넘겨서, undef이 반환되는 일이 없도록 할 것.
  $foo = sum 0, @values;

1.4. 알려진 버그

(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 { !$_ } @_ }

1.6. 참고

Perldoc:Scalar::Util2, Cpan:List::MoreUtils3

1.7. COPYRIGHT

(생략)

2. 기타

2.1. reduce 사용시 $a, $b 에 대한 used once 경고

List::Util 의 reduce 또는 /List-MoreUtilspairwise를 쓸 경우 $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

이름:  
Homepage:
내용:
 


컴퓨터분류 Perl
각주:
1. identity value - 정확한 의미는 잘 모르겠는데, 리스트가 비었을 경우 undef 대신에 반환될 값을 의미하는 듯
2. /Scalar-Util
3. /List-MoreUtils

마지막 편집일: 2016-6-1 8:36 am (변경사항 [d])
2038 hits | Permalink | 변경내역 보기 [h] | 페이지 소스 보기