Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在perl中分别打印数字、大写字母和小写字母_Regex_Perl - Fatal编程技术网

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%    --