Я хочу заменить
R00001,abcd xyz pqr,undef,undef,PEND
с участием
R00001,abcd xyz pqr,undef,undef,DONE
Я пробовал использовать
$line =~ s/(\w+,\w+,\w+,\w+),\w+/$1,"DONE"/g;
Проблема в том, что в abcd xyz pqr есть пробелы, поэтому он не может синхронизироваться с \ w +. Какие изменения я могу внести в эту часть кода, чтобы она работала?
Спасибо
почему бы просто не
$line =~ s/PEND/DONE/;
если вы хотите сохранить регулярное выражение, подобное тому, которое вы использовали, вы можете $line =~ s/(\w+,[\w\s]+,\w+,\w+),\w+/$1,"DONE"/g;
Если вы хотите разрешить пробелы в любом из ваших полей, вы можете сделать это:
$line =~ s/^((?:[\w\s]+,){4})[\w\s]+$/$1DONE/g;
Мой вопрос в том, почему мы должны беспокоиться о пробелах. У вас есть оператор ,
в ключевом слове before, поэтому его может быть простая замена.
$line=~s/\,([^\,]*)$/\,DONE/g;
Объяснение регулярного выражения:
$line=~s/\, #Check the last comma
([^\,]*) #Rest of the words (PEND)
$ # End of the line
/\,DONE/g; #Replace whatever you want (DONE)
Снимаем колесо с полки:
use Modern::Perl;
use Text::CSV::Easy qw( csv_parse );
while (<DATA>) {
my @row = csv_parse $_;
$row[ 4 ] = 'DONE' if $row[ 4 ] eq 'PEND';
say join',', @row;
}
__DATA__
R00001,abcd xyz pqr,undef,undef,PEND
ВЫХОД:
R00001,abcd xyz pqr,undef,undef,DONE
$line=~s/\,([^\,]*)$/\,DONE/g;