Regex 在perl中分别打印数字、大写字母和小写字母
我有这样一个清单:Regex 在perl中分别打印数字、大写字母和小写字母,regex,perl,Regex,Perl,我有这样一个清单: DD2aaQQmmm AA34DDmm 我想分别打印大写字母、小写字母和数字,就像: DDQQ aammm 2 AADD mm 34 我应该如何在perl中使用regex实现这一点 我已尝试使用大写字母: #!/usr/bin/perl my @array = <>; chomp(@array); foreach (@array){ if ($_ = ~ /([A-Z][a-z])/){ print $_ "\n" }
DD2aaQQmmm
AA34DDmm
我想分别打印大写字母、小写字母和数字,就像:
DDQQ aammm 2
AADD mm 34
我应该如何在perl中使用regex实现这一点
我已尝试使用大写字母:
#!/usr/bin/perl
my @array = <>;
chomp(@array);
foreach (@array){
if ($_ = ~ /([A-Z][a-z])/){
print $_ "\n"
}
}
#/usr/bin/perl
my@array=;
chomp(@array);
foreach(@array){
如果($)=~/([A-Z][A-Z])/){
打印美元“\n”
}
}
但这只打印出以大写字母开头的单词。任务非常简单——将小麦和谷壳分开
use strict;
use warnings;
use feature 'say';
while(my $line = <DATA>) {
my @out;
$out[0] = $line =~ s/[^A-Z]//gr;
$out[1] = $line =~ s/[^a-z]//gr;
$out[2] = $line =~ s/[^0-9]//gr;
say join(' ', @out);
}
__DATA__
DD2aaQQmmm
AA34DDmm
当然,最终的脚本可以从命令行中给定的管道或文件中读取
use strict;
use warnings;
use feature 'say';
while(<>) {
my @out;
$out[0] = s/[^A-Z]//gr;
$out[1] = s/[^a-z]//gr;
$out[2] = s/[^0-9]//gr;
say join(' ', @out);
}
使用严格;
使用警告;
使用特征“说”;
while(){
我的孩子出去了;
$out[0]=s/[^A-Z]//gr;
$out[1]=s/[^a-z]///gr;
$out[2]=s/[^0-9]///gr;
说join(“”,@out);
}
北极熊解决方案是绝对正确的,但需要perl 5.14+,这里有一个针对较旧perl版本的简单解决方法
use strict;
use warnings;
while(my $line = <DATA>) {
my @out = ($line, $line, $line);
$out[0] =~ s/[^A-Z]//g;
$out[1] =~ s/[^a-z]//g;
$out[2] =~ s/[^0-9]//g;
print join(' ', @out) . "\n";
}
__DATA__
DD2aaQQmmm
AA34DDmm
使用严格;
使用警告;
while(我的$line=){
my@out=($line,$line,$line);
$out[0]=~s/[^A-Z]//g;
$out[1]=~s/[^a-z]//g;
$out[2]=~s/[^0-9]//g;
打印联接(“”,@out)。“\n”;
}
__资料__
dd2aaqmmm
AA34DDmm
另一种方法是使用
tr
大约比s//
快6倍,下面是一个基准测试:
use Modern::Perl;
use Benchmark qw(:all);
my $str = "DD2aaQQmmm";
my $count = -3;
cmpthese($count, {
'tr' => sub {
my @out;
push @out, $str =~ tr/A-Z//cdr;
push @out, $str =~ tr/a-z//cdr;
push @out, $str =~ tr/0-9//cdr;
},
'subst' => sub {
my @out;
$out[0] = $str =~ s/[^A-Z]//gr;
$out[1] = $str =~ s/[^a-z]//gr;
$out[2] = $str =~ s/[^0-9]//gr;
},
});
输出:
DDQQ aammm 2
AADD mm 34
Rate subst tr
subst 58165/s -- -84%
tr 357629/s 515% --
在发布之前,您是否尝试过自己解决这个问题?您尝试过什么?你有什么问题?请给我们看一下您的代码?这是正确的,但很难读懂。使用
my@out=($line,$line,$line)$out[0]=~s/..
会让我花更少的时间来理解这段代码。@GeorgMavridis——三份多余的无用副本,更多的工作是白费的。(想象一个砖块层把每一块砖块放到一楼,把它捡起来放到工作地点)我不知道为什么,但作为一个输出,我只得到“1”。你的perl版本是什么?在perl 5.14.0或更高版本中,您可以使用新的/r。。。请检查ulr@PolarBear——使用/r修饰符会导致返回替换结果,而不是修改基础变量,这是我不希望看到的,因此我不容易阅读。
use Modern::Perl;
use Benchmark qw(:all);
my $str = "DD2aaQQmmm";
my $count = -3;
cmpthese($count, {
'tr' => sub {
my @out;
push @out, $str =~ tr/A-Z//cdr;
push @out, $str =~ tr/a-z//cdr;
push @out, $str =~ tr/0-9//cdr;
},
'subst' => sub {
my @out;
$out[0] = $str =~ s/[^A-Z]//gr;
$out[1] = $str =~ s/[^a-z]//gr;
$out[2] = $str =~ s/[^0-9]//gr;
},
});
Rate subst tr
subst 58165/s -- -84%
tr 357629/s 515% --