Во-первых: используйте модуль для работы с CSV-файлами, и хорошим будет Text :: CSV
Теперь для такой работы, на этот раз, простой фильтрвсе в порядке:
my $line = q(first,last John,Smith Francis,);
$line =~ s/.*,\K$/filled_last_field/;
Жадный .*
соответствует до последнего экземпляра следующего шаблона (запятая здесь) в строке.\K
форма положительного взгляда за спиной отбрасывает все предыдущие совпадения, поэтому они не расходуются;поэтому он заменяет шаблон только после него (при необходимости добавляет фразу в этом случае).
Если вы хотите сначала заменить файл, вы читаете его построчно и записываете измененные строки вновый файл, который затем перемещается поверх старого.
open my $fh, '<', $file or die "Can't open $file: $!";
open my $fh_out, '>', $new_file or die "Can't open $new_file: $!";
while (<$fh>) {
print $fh_out s/.*,\K$/filled_last_field/r;
}
# Move $new_file to $file
, где я использовал модификатор /r
, который возвращает измененную строку, как раз для print
Вот.См. этот пост и этот пост (например) для полных программ такого рода с соответствующими деталями.
Или с Path :: Tiny
path($file)->edit_lines( sub { s/.*,\K$/ADDED/ } )
Методы для непосредственного редактирования файла были добавлены в версии 0.077.Многие из методов модуля имеют свои _utf8
аналоги, а также есть edit_lines_utf8 .
В однострочном
perl -wpe's/.*,\K$/ADDED/' file.csv > new_file.csv
или,изменить входной файл на месте
perl -i -wpe's/.*,\K$/ADDED/' file.csv
или изменить его, а также сохранить резервную копию
perl -i.bak -wpe's/.*,\K$/ADDED/' file.csv