Используя Perl, как я могу заменить новые строки запятыми?

Используйте шаблон несуществующего объекта или выдайте исключение.

6
задан brian d foy 21 October 2009 в 15:40
поделиться

7 ответов

use strict;
use warnings;

my $infile = $ARGV[0] or die "$0 Usage:\n\t$0 <input file>\n\n";
open(my $in_fh , '<' , $infile) or die "$0 Error: Couldn't open $infile for reading: $!\n";
my $file_contents;
{

    local $/; # slurp in the entire file. Limit change to $/ to enclosing block.
    $file_contents = <$in_fh>

}
close($in_fh) or die "$0 Error: Couldn't close $infile after reading: $!\n";

# change DOS line endings to commas
$file_contents =~ s/\r\n/,/g;
$file_contents =~ s/,$//; # get rid of last comma

# finally output the resulting string to STDOUT
print $file_contents . "\n";

Текст вашего вопроса и пример вывода не согласованы. Если вы конвертируете все окончания строк в запятые, вы получите дополнительную запятую в конце, начиная с конца последней строки. Но ваш пример показывает только запятые между числами. Я предполагал, что вы хотите, чтобы вывод кода соответствовал вашему примеру и что текст вопроса был неправильным, однако, если вы хотите, чтобы последняя запятая, просто удалите строку с комментарием «избавьтесь от последней запятой».

Если какая-либо команда непонятна , http://perldoc.perl.org/ - ваш друг (в правом верхнем углу есть поле поиска).

4
ответ дан 8 December 2019 в 02:09
поделиться

В оболочке вы можете сделать это разными способами:

cat input | xargs echo | tr ' ' ,

или

perl -pe 's/\r?\n/,/' input > output

Я знаю, что вы хотели, чтобы это было длиннее, но я действительно не вижу смысла писать многострочные сценарий для решения такой простой задачи - простое регулярное выражение (в случае решения perl) полностью работоспособно, и это не что-то искусственно сокращенное - это тип кода, который я бы использовал ежедневно для решения проблемы.

28
ответ дан 8 December 2019 в 02:09
поделиться

Это очень просто:

tr '\n' , <infile >outfile
2
ответ дан 8 December 2019 в 02:09
поделиться
#!/bin/perl
while(<>) {      # Read from stdin one line at a time
    s:\r\n:,:g;  # Replace CRLF in current line with comma
    print;       # Write out the new line
}
9
ответ дан 8 December 2019 в 02:09
поделиться

Избегайте прихлебки, не ставьте запятую в конце и распечатывайте текстовый файл правильного формата (все строки должны заканчиваться символами новой строки):

#!/usr/bin/perl

use strict;
use warnings;

my $line = <>;

while ( 1 ) {
    my $next = <>;
    s{(?:\015\012?|\012)+$}{} for $line, $next;
    if ( length $next ) {
        print $line, q{,};
        $line = $next;
    }
    else {
        print $line, "\n";
        last;
    }
}
__END__
1
ответ дан 8 December 2019 в 02:09
поделиться

с Perl

$\ = "\n";              # set output record separator
$, = ',';
$/ = "\n\n";

while (<>) {
    chomp;   
    @f = split('\s+', $_);
    print join($,,@f);
}

в unix, вы также можете использовать такие инструменты, как awk или tr

awk 'BEGIN{OFS=",";RS=""}{$1=$1}1' file

или

tr "\n" "," < file
0
ответ дан 8 December 2019 в 02:09
поделиться

Personally I would avoid having to look a line ahead (as in Sinar's answer). Sometimes you need to but I have sometimes done things wrong in processing the last line.

use strict;
use warnings;

my $outputcomma = 0;  # No comma before first line

while ( <> )
{
    print ',' if  $outputcomma ;
    $outputcomma = 1 ; # output commas from now on
    s/\r?\n$// ;
    print ;

}
print  "\n" ;
1
ответ дан 8 December 2019 в 02:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: