Perl 목록 처리도 해시를 위한 것입니다.

10871 단어 hashesmapperllists
이번 달에 저는 Perl(무엇보다도)을 핵심으로 하는 사이버 보안 제공업체인 Alert Logic에서 새로운 일을 시작했습니다. 저는 많은 것을 배웠고 그 과정의 일부는 코드 기반의 API를 이해하는 것이었습니다. 이를 위해 Perl array-processing , list-processinghash- (i.e., associative array)-processing functions 을 사용하여 데이터 구조를 분리하는 작은 테스트 스크립트를 작성했습니다.

이전에 map , grep , 친구 couple times 을 다루었습니다. Most recently , List::Util’s any function을 사용하여 목록의 항목에 대해 조건이 true인지 확인하는 방법을 설명했습니다. 가장 간단한 경우에 주어진 값이 목록에 전혀 없는지 확인하는 데 사용할 수 있습니다.

use feature 'say';
use List::Util 'any';
my @colors =
  qw(red orange yellow green blue indigo violet);
say 'matched' if any { /^red$/ } @colors;


그러나 임의의 문자열을 사용하여 이 작업을 많이 수행하려는 경우 배열을 해시의 키로 변환한 다음 거기에서 구성원 자격을 확인합니다. 예를 들어, 다음은 색상 입력(키보드 또는 인수로 전달된 파일)이 무지개에 있는지 확인하는 간단한 스크립트입니다.

#!/usr/bin/env perl

use v5.22; # introduced <<>> for safe opening of arguments
use warnings;

my %in_colors = map {$_ => 1}
  qw(red orange yellow green blue indigo violet);

while (<<>>) {
  chomp;
  say "$_ is in the rainbow" if $in_colors{$_};
}


List::Util에는 Perl FAQ section 4 advises이 있어 해시를 탐색할 때 유용합니다. 예를 들어 pairgrepgrep처럼 작동하지만 전달된 각 키와 값에 $a$b을 할당하고 일치하는 결과 쌍을 반환합니다. 특정 값 조건과 일치하는 해시 항목을 검색하는 빠른 방법으로 사용했습니다.

use List::Util 'pairgrep';
my %numbers = (zero => 0, one => 1, two => 2, three => 3);
my %odds = pairgrep {$b % 2} %numbers;


물론, 일반 grep , keys 및 a bunch of functions for processing lists of pairs 을 혼합하여 호출하여 이 작업을 수행할 수 있지만 더 시끄럽고 반복적입니다.

use v5.20; # for key/value hash slice 
my %odds = %numbers{grep {$numbers{$_} % 2} keys %numbers};

pairgrep의 컴파일된 C 기반 hash slice 코드는 XS(내 컴퓨터의 479,828개 항목)으로 구성된 해시를 통해 작동하는 이 Benchmark 스크립트에서 알 수 있듯이 더 빠를 수 있습니다.

#!/usr/bin/env perl

use v5.20;
use warnings;
use List::Util 'pairgrep';
use Benchmark 'cmpthese';

my (%words, $count);
open my $fh, '<', '/usr/share/dict/words'
  or die "can't open words: $!";
while (<$fh>) {
  chomp;
  $words{$_} = $count++;
}
close $fh;

cmpthese(100, {
  grep => sub {
    my %odds = %words{grep {$words{$_} % 2} keys %words};
  },
  pairgrep => sub {
    my %odds = pairgrep {$b % 2} %words;
  },
} );


벤치마크 결과:

           Rate     grep pairgrep
grep     1.47/s       --     -20%
pairgrep 1.84/s      25%       --



일반적으로 Unix words file 의 자습서 Perl documentation , references , lists of lists , FAQ data structures cookbookarray 및 1061506 을 살펴보시기 바랍니다. 그런 다음 일반적인 작업을 위한 기성 기능을 위해 다양한 hash manipulation(특히 포함된 list-processing modules 및 CPAN의 List::Util)을 살펴보십시오. 프로그램에 필요한 데이터 구조를 생성, 관리 및 처리하기 위한 풍부한 기술을 찾을 수 있습니다.

좋은 웹페이지 즐겨찾기