我有一个包含
等元素的数组@array=("link_dm &&& drv_ena&&&1",
"txp_n_los|rx_n_lost",
"eof &&& 2 &&& length =!!!drv!!!0");
我希望在第一个“&&&&”之前得到所有字符,如果元素没有“&&&&”,那么我需要提取整个元素。 / p>
这就是我要提取的内容:
likn_dm
txp_n_los | rx_n_lost
EOF
我用过
foreach my $row (@array){
if($row =~ /^(.*)\&{3}/){
push @firstelements,$1;
}
}
但我得到了
link_dm&&& drv_ena
txp_n_los | rx_n_lost
eof&&& 2
有人可以建议我如何实现这个目标吗?
答案 0 :(得分:3)
或许只是split
ting会有所帮助:
use strict;
use warnings;
my @array = (
"link_dm &&& drv_ena&&&1",
"txp_n_los|rx_n_lost",
"eof &&& 2 &&& length =!!!drv!!!0"
);
foreach my $row (@array){
my ($chars) = split /\&{3}/, $row, 2;
print $chars, "\n"
}
输出:
link_dm
txp_n_los|rx_n_lost
eof
答案 1 :(得分:0)
你可以写:
@firstelements = map { m/^(.*?) *&&&/ ? $1 : $_ } @array;
或者,如果您希望foreach
超过map
而if
超过?:
:
foreach my $row (@array){
if($row =~ /^(.*)\&{3}/) {
push @firstelements, $1;
} else {
push @firstelements, $row;
}
}
答案 2 :(得分:0)
for (@array) {
print "$1\n" if /([^ ]*)(?: *[&]{3}.*)?$/;
}
答案 3 :(得分:0)
如果您使用的是正则表达式,请使用最小生成模式:.*?
。请参阅perldoc perlre
http://perldoc.perl.org/perlre.html
#!/usr/bin/env perl
use strict;
use warnings;
# --------------------------------------
use charnames qw( :full :short );
use English qw( -no_match_vars ); # Avoids regex performance penalty
use Data::Dumper;
# Make Data::Dumper pretty
$Data::Dumper::Sortkeys = 1;
$Data::Dumper::Indent = 1;
# Set maximum depth for Data::Dumper, zero means unlimited
local $Data::Dumper::Maxdepth = 0;
# conditional compile DEBUGging statements
# See http://lookatperl.blogspot.ca/2013/07/a-look-at-conditional-compiling-of.html
use constant DEBUG => $ENV{DEBUG};
# --------------------------------------
my @array = (
"link_dm &&& drv_ena&&&1",
"txp_n_los|rx_n_lost",
"eof &&& 2 &&& length =!!!drv!!!0",
);
my @first_elements = ();
for my $line ( @array ){
# check for '&&&'
if( my ( $first_element ) = $line =~ m{ \A (.*?) \s* \&{3} }msx ){
push @first_elements, $first_element;
}else{
push @first_elements, $line;
}
}
print Dumper \@first_elements;