сравнить введенные почтовые индексы с массивом Perl - PullRequest
3 голосов
/ 05 мая 2011

У меня есть массив, который содержит начальные 2 символа областей почтового индекса в Perl, например:

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

У меня есть окно поиска, в котором пользователь вводит частично или полный почтовый индекс. Мне нужно проверить, начинался ли введенный ими почтовый индекс с одного из элементов массива, поэтому, например, если бы они ввели «CV2 1DH», он оценивал бы как «истина», а если бы они вводили что-то вроде «YO1 8WE», он бы перевел бы в «ложь» как он не начинается с одного из значений массива.

Теперь это было бы легко сделать для меня в PHP, но Perl не слишком хорош для меня, и до сих пор мои усилия не были очень плодотворными.

Любая идея выглядывает?

Ответы [ 4 ]

5 голосов
/ 05 мая 2011

Если ваш список принятых почтовых индексов достаточно велик, чтобы производительность в соответствующем коде была реальной проблемой (вероятно, это не так), вам, вероятно, было бы лучше использовать поиск по хешу вместо массива в любом случае:

#!/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.

5 голосов
/ 05 мая 2011

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 голос
/ 05 мая 2011

Хорошо, старомодная версия foreach, обратите внимание, что она учитывает регистр символов. Интересно сравнить с версией ~~.

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;
}
1 голос
/ 05 мая 2011

Вы можете использовать List::Util s first или grep встроенный:

use List::Util 'first';

my $postcode = substr $input, 0, 2;    
my $status = (first {$_ eq $postcode} @acceptedPostcodes) ? 1 : 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...