Так как Вы не заботитесь, какой заканчивается, почему не только имеют единственный WaitHandle для всех потоков и ожидают на этом? Какой бы ни каждый приходит первым, может установить дескриптор.
Вы можете использовать Класс: CSV .
use Class::CSV;
my $csv = Class::CSV->new(
fields => [qw/userid username/]
);
$csv->add_line([2063, 'testuser']);
$csv->add_line({
userid => 2064,
username => 'testuser2'
});
$csv->print();
# 2063,testuser
# 2064,testuser2
Изменить : Для дополнительных библиотек вы можете искать в CPAN .
Обычно мы используем Text :: CSV_XS
(на котором основан вышеупомянутый Class :: CSV
)
ОБНОВЛЕНИЕ: Комментаторы ниже также предлагают использовать Text :: CSV
, который загрузит Text :: CSV_XS
или, если это не доступно, вернется к Text :: CSV_PP
который не имеет зависимости XS
и может быть проще установить.
Есть несколько способов сделать это .
Есть много других на CPAN .
Конечно , вы можете проигнорировать все это и просто использовать цикл, соединение и печать:
my @table = (
[ 'a', 'b', 'c'],
[ 1, 2, 3 ],
[ 2, 4, 6 ],
);
for my $row ( @table ) {
print join( ',', @$row ), "\n";
}
Просто запустите свой сценарий и перенаправьте вывод в файл, бац! вы сделали. Или вы можете сходить с ума и открыть дескриптор файла и распечатать прямо в файл.
Но тогда вы не сможете обрабатывать многострочные поля, встроенные запятые или любую из многих других странностей. которые могут появиться в задачах обработки данных такого рода. Так что будьте осторожны с этим подходом.
Мои рекомендации: