#perl
#perl
Вопрос:
На самом деле я использую один perl-скрипт для подготовки Readme txt для моих сборок. в этом скрипте я использовал
foreach $line (<LOG>)
{
if(length(trim($line))>0)
{
$line=trim($line);
$line=~ s/[r]//gs;
if(rindex($line,'#')!=-1)
{
$icut=substr($line,0,index($line,']'));
$icut2=substr($icut,index($icut,'#') 1,length($icut));
}
push(@issue,$icut2);
это выборка правильной проблемы, но когда ситуация становится такой
[I#1303350], [I#1270918],[I#1312521] Updated Physical Confirmation Template based on CO
тогда он выдает только одну проблему, нет, не все проблемы в той же строке. итак, я изменил свой код следующим образом
foreach $revno(<REV>)
{
if(length(trim($revno))>0)
{
$revno=trim($revno);
$revno=~ s/[r]//gs;
if(rindex($revno,'#')!=-1)
{
$revcut=substr($revno,0,rindex($revno,']'));
print "$revcutn";
$revcut1=substr($revcut,index($revcut,'#') 1,length($revcut));
}
}
push(@issue,$revcut1);
теперь оно извлекает все, ревизии нет, но вывод выглядит так, 1312588,1303350], [I#1270918],[I#1312521
но я хочу удалить #
[
]
I
только, но не ,
поэтому, пожалуйста, скажите мне, как я могу проанализировать это с помощью регулярного выражения.
Комментарии:
1. короче говоря, мой вопрос в том, как я могу разобрать
1312588,1303350], [I#1270918],[I#1312521
на1312588,1303350,1270918,1312521
Ответ №1:
Это можно сделать без регулярных выражений: Транслитерировать: tr///
use warnings;
use strict;
my $s = '1312588,1303350], [I#1270918],[I#1312521';
$s =~ tr/ ][#I//d;
print "$sn";
__END__
1312588,1303350,1270918,1312521
Ответ №2:
Вы можете сделать это следующим образом:
echo "[I#1303350], [I#1270918],[I#1312521]" | perl -lnwe "print for m/#(d )/g"
Комментарии:
1. Это не сохраняет запятые, как запрашивал OP.
2. Таким образом, он может вытащить
join
оператор и объединить их.
Ответ №3:
Это работает для меня:
my @issues = $line_of_data =~ m/#(d )/g;
И если вам нужны запятые, это сделать намного проще:
my $with_commas = join( ', ', @issues );
И у вас все еще есть номера отдельных проблем в виде «атомов» данных.