Я бы не стал использовать регулярное выражение в ситуации, которую вы объяснили. Вместо этого просто посмотрите на количество строк, которые вы прочитали, и выведите все, что захотите, когда прочитаете правильное количество строк:
while( <DATA> ) {
if( $. % 3 ) { # $. is the line number for that filehandle
print;
}
else {
chomp;
print $_, ",\n\n";
}
}
__DATA__
a1
a2
a3
b1
b2
b3
c1
c2
c3
Если ваше содержимое находится в скаляре в программе,вы можете открыть дескриптор файла в этом скаляре, чтобы вы могли использовать те же инструменты чтения файлов:
open my $string_fh, '<', \$content;
while( <$string_fh> ) {
if( $. % 3 ) { # $. is the line number for that filehandle
print;
}
else {
chomp;
print $_, ",\n\n";
}
}
Превращение вещей в проблемы чтения файлов - это один из моих любимых приемов, и я показываю еще много способов сделать этовещи в Эффективное программирование на Perl . Например, если вы хотите также записать в строку вместо стандартного вывода, вы можете открыть дескриптор файла по скалярной ссылке:
open my $string_fh, '<', \$content;
open my $out_fh, '>', \(my $out);
while( <$string_fh> ) {
if( $. % 3 ) { # $. is the line number for that filehandle
print {$out_fh} $_
}
else {
chomp;
print {$out_fh} $_, ",\n\n";
}
}
print $out;
Это позволяет легко переключаться между записью информации и обратно. в строке или записи в "настоящий" файловый дескриптор.