2011-05-05 4 views
3

내가 가지고과 같이 펄 우편 번호 영역의 시작이 개 문자를 포함하는 배열 :펄 배열에 대한 우편 번호를 입력 한 평가

@acceptedPostcodes = ("CV", "LE", "CM", "CB", "EN", "SG", "NN", "MK", "LU", "PE", "ST", "TF", "DE", "WS"); 

나는 사용자가 일부 또는 전체 게시물을 입력하는 검색 상자를 가지고 암호. 만약 그들이 'CV2 1DH'를 입력하면 예를 들어 'true'로 평가하고 'YO1 8WE'와 같이 입력하면 false로 평가 될 것이라고 입력 한 포스트 코드가 배열의 요소 중 하나와 함께 시작했는지 확인해야합니다. 배열 값 중 하나로 시작하지 않습니다.

이제는 PHP에서 나에게 쉽게 할 수 있지만 Perl은 뭔가 좋은 점이 없으며 지금까지는 열심히 노력하지 않았습니다.

어떤 아이디어가 있습니까? .

+0

이 스크립트가 .cgi 스크립트를 추가하여 별 차이가 있는지 확실하지 않습니다. – azzy81

답변

5

는 일치하는 코드에서 그 성능은 아마 당신은 어쨌든 배열 대신 해시 조회를 사용하여 더 나을 것, (아마 아닌) 실제 관심사입니다 :

#!/usr/bin/perl 

use strict; 
use warnings; 

my %accepted_postcodes = ("CV" => 1, "LE" => 1, "CM" => 1, "CB" => 1, "EN" => 1, "SG" => 1, "NN" => 1, "MK" => 1, "LU" => 1, "PE" => 1, "ST" => 1, "TF" => 1, "DE" => 1, "WS" => 1); 
# Or, to be more terse: 
# my %accepted_postcodes = map { $_ => 1 } qw(CV LE CM CB EN SG NN MK LU PE ST TF DE WS); 

my $postcode = "CV21 1AA"; 

if (exists $accepted_postcodes{substr $postcode, 0, 2}) { 
    print "$postcode is OK\n" ; 
} else { 
    print "$postcode is not OK\n"; 
} 

이 방법은 5.8.8에서 정상적으로 작동합니다.

+0

좋은 데이터이며 작은 데이터 세트로도 지금까지 가장 빠릅니다. –

+0

다른 솔루션이 훌륭해 보이지만 너무 놀지 않고 작동했기 때문에이 솔루션과 함께갔습니다. 좋은 점은 제 데이터 세트의 우편 번호 영역이 약 ​​12-15에 불과하므로 걱정할 속도 문제가 없어야한다는 것입니다. 거기에 대한 답변 eveyone에 감사드립니다. – azzy81

5

Smart Match (~~)는 입력 된 문자열에서 첫 두 글자를 얻을 수 substr를 사용 후

#!/usr/bin/perl 

use strict; 
use warnings; 
use v5.10; 

my @acceptedPostcodes = ("CV", "LE", "CM", "CB", "EN", "SG", "NN", "MK", "LU", "PE", "ST", "TF", "DE", "WS"); 

my $postcode = "CV21 1AA"; 

if ((substr $postcode, 0, 2) ~~ @acceptedPostcodes) { 
    say "$postcode is OK" ; 
} else { 
    say "$postcode is not OK"; 
} 
+1

이것은 Perl 5.10에서만 사용할 수 있습니다. –

+0

5.10 이전의 Perl 5 버전은 EOLed되었으며 5.10은 5.12로 대체되었습니다. 나는 오늘 5.8에 대한 새로운 발전을 정말로하지 않을 것이다. – Quentin

+0

이것은 매우 바보 같은 질문이지만, 사용하는 버전을 확인하는 가장 쉬운 방법은 무엇입니까? – azzy81

1

를 사용할 수있는 여기 (당신의 친구입니다 List::Utilfirst, 또는 grep 내장 :

use List::Util 'first'; 

my $postcode = substr $input, 0, 2;  
my $status = (first {$_ eq $postcode} @acceptedPostcodes) ? 1 : 0; 
+0

그것은 옳았 기 때문에 표시했지만 foreach와 ~~ solutions보다 상당히 느립니다. –

+0

@JonB :'List :: Util'은 속도면에서 C로 작성 되었기 때문에'grep/foreach/~~'보다 느리지는 않습니다. –

+0

방금 ​​시도했습니다. 최소한의 벤치 마크 였지만 2000000 번 반복에서 foreach와 ~~에 대해서는 약 35 초가 걸렸지 만 List :: Util은 약 60을 기록했습니다. –

1

예전 구식 foreach 버전은 대소 문자를 구분합니다. ~~ 버전 int와 거의 동일한 벤치 마크 아무렇게나. 접수 우편 번호의 목록이 충분히 큰 경우

sub validatePostcode($) 
{ 
    my ($testPostcode) = @_; 
    my @acceptedPostcodes = ("CV", "LE", "CM", "CB", "EN", "SG", "NN", "MK", "LU", "PE", "ST", "TF", "DE", "WS"); 

    $testPostcode = substr($testPostcode, 0, 2); 
    foreach my $postcode (@acceptedPostcodes) 
    { 
    if($postcode eq $testPostcode) 
    { 
    return 1; 
    } 
    } 

    return 0; 
} 
관련 문제