Ответ, который вы приняли, не дает результатов, о которых вы заявляете, что хотите получить ответ на свой вопрос. В частности, 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