То, что вы, похоже, делаете, - это изменение этого файла с запятой-разделителем на символ табуляции. Если это так, это может быть более простой способ сделать это:
while (<>) {
s/,/\t/g;
print;
}
А затем используйте это так:
$ script.pl cool.txt > mool.txt
Вы могли бы даже уйти с однострочником:
perl -pwe 's/,/\t/g' cool.txt > mool.txt
Или, если у вас странные пробелы:
perl -pwe 's/^\s+|\s+$//g; s/,/\t/g' cool.txt > mool.txt
Или, более безопасная версия, используя Text :: CSV . Это будет обрабатывать сложные данные и тому подобное для вас. Если вы получите пустой вывод, это может быть лишние пробелы. Если это так, вы можете запустить приведенную выше строку без строки s/,/\t/g
, чтобы получить «очищенную» версию входного файла:
perl -pwe 's/^\s+|\s+$//g;' cool.txt > cool_clean.txt
Сценарий:
use warnings;
use strict;
use Text::CSV;
use autodie;
my $csv_in = Text::CSV->new();
my $csv_out = Text::CSV->new( { sep_char => "\t", eol => "\n" } );
open my $fh, '<', 'data.csv';
open my $out, '>', 'mool.txt';
while (my $row = $csv_in->getline($fh)) {
$csv_out->print($out, $row);
}