Как я могу проверить, является ли значение числовым, алфавитным или буквенно-цифровым в Perl? - PullRequest
3 голосов
/ 07 апреля 2010

У меня есть массив, значения которого вводятся пользователем, например:

aa df rrr5 4323 54 hjy 10 gj @fgf %d

Теперь я хочу проверить каждое значение в массиве, чтобы увидеть, является ли оно числовым, буквенным (a-zA-Z) или буквенно-цифровым, и сохранить их в других соответствующих массивах.

Я сделал:

my @num;
my @char;
my @alphanum;

my $str =<>;
  my @temp = split(" ",$str);
        foreach (@temp)
           {
                print "input : $_ \n";
                if ($_ =~/^(\d+\.?\d*|\.\d+)$/)
                    {
                        push(@num,$_);
                    }
           }

Это работает. Точно так же я хочу проверить алфавит и буквенно-цифровые значения

Буквенно-цифровой пример: fr43 6t$ $eed5 *jh

Ответы [ 5 ]

7 голосов
/ 07 апреля 2010

Perl поддерживает классы символов POSIX, так что вы можете сделать это:

$string =~ /^[[:alpha:]]+$/;
$string =~ /^[[:alnum:]]+$/;

Числа определены не так хорошо, но функция Scalar :: Util look_like_number может делать то, что вам нужноделать.

3 голосов
/ 07 апреля 2010

Ответ, который вы приняли, не дает результатов, о которых вы заявляете, что хотите получить ответ на свой вопрос. В частности, POSIX класс символов [:alphanum:] не будет соответствовать знакам пунктуации, что означает, что 6t $ $ eed5 * jh не будет сопоставлено. Чтобы соответствовать символам пунктуации, вам нужно добавить [:punct:] в класс char. См. шпаргалку Regex .

Так, например, если у вас есть файл tokens.txt, который содержит:

aa df rrr5 4323 54 hjy 10 gj @fgf% d fr43 6t $ $ eed5 * jh

И вы запускаете этот Perl-скрипт:

#!/usr/bin/perl -w
use warnings;
use diagnostics;
use strict;
use Scalar::Util qw( looks_like_number );


my $str =<>;
my @temp = split(" ",$str);

my @num = grep { looks_like_number($_) } @temp;
my @char = grep /^[[:alpha:]]+$/, @temp;
my @alphanum = grep /^[[:alnum:][:punct:]]+$/, @temp;

print "Numbers: " . join(' ', @num) . "\n";
print "Alpha: " . join(' ', @char) . "\n";
print "Alphanum: " . join(' ', @alphanum) . "\n";

как это:

cat tokens.txt | ./tokenize.pl

Вы получите вывод:

Номера: 4323 54 10
Альфа: ааааааааааа
Alphanum: aa df rrr5 4323 54 hjy 10 gj @fgf% d fr43 6t $ $ eed5 * jh

Однако, по вашему вопросу, вы не хотите сопоставлять все знаки препинания, такие как @ и %, а вместо этого только определенные символы, такие как $ и *.

Если это так, тогда просто измените совпадение Alphanum на:

my @alphanum = grep /^[[:alnum:]\$\*]+$/, @temp;

Что даст вам желаемый результат

Номера: 4323 54 10
Альфа: аааааааааааа
Alphanum: aa df rrr5 4323 54 hjy 10 gj fr43 6t $ $ eed5 * jh

1 голос
/ 07 апреля 2010

Для разделения ввода на массивы что-то вроде этого будет работать и позволит легко добавлять или изменять ваши совпадения.

my $input = 'aa df rrr5 4323 54 hjy 10 gj @fgf %d';
my %tests = ( 
    num   => '\d+',
    alpha => '[[:alpha:]]+', 
    alnum => '[[:alnum:]]+' 
);

my %res;
for my $t (keys %tests) {
    for (split(' ', $input)) {
        push(@{ $res{$t} }, $_) if (/^$tests{$t}$/i);
    }
}
0 голосов
/ 08 апреля 2010

Если вы хотите распознать все действительные числа (научные / фиксированные / ... обозначения), вы можете позволить Perl выполнять такую ​​работу:

sub test_num {
    no warnings "all";
    $b = "$_[0]"; 
    $a = $b + 0; 
    return ($a eq $b);
}
push(@num, $tmp) if (test_num($tmp));

(Причина строки $b = "$_[0]"; заключается в том, что в противном случае исходная переменная - $tmp - вводится в числовой контекст внутри функции test_num - немного нежелательного побочного эффекта)

0 голосов
/ 07 апреля 2010

алфавит:

 /^[a-z]+$/i

Что большинство людей имеют в виду под буквенно-цифровым:

 /^[a-z0-9]+$/i

НО ПОДОЖДИТЕ:

примечание: буквенно-цифровой отл. fr43 6t $ $ eed5 * jh

Я не понял этого, но, судя по вашему комментарию ниже и цитате выше, то, что вы подразумеваете под буквенно-цифровым кодом, может быть достигнуто

 /^[[:graph:]]+$/

Соответствует любым печатным символам ASCII, кроме пробелов.

Надеюсь, это решило вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...