Как уже упоминали другие люди, правильный способ сделать это с помощью Text :: CSV и либо Text::CSV_XS
back-end (для чтения FASTEST), либо Text::CSV_PP
back-end (если вы можете не скомпилируйте модуль XS
).
Если вам разрешено получать дополнительный код локально (например, ваши собственные персональные модули), вы можете взять Text::CSV_PP
и поместить его куда-нибудь локально, а затем получить доступ к нему с помощью обходного пути use lib
:
use lib '/path/to/my/perllib';
use Text::CSV_PP;
Кроме того, если нет альтернативы чтению всего файла в памяти и (я полагаю) сохранению в скаляре, вы все равно можете прочитать его как дескриптор файла, открыв дескриптор скаляра:
my $data = stupid_required_interface_that_reads_the_entire_giant_file();
open my $text_handle, '<', \$data
or die "Failed to open the handle: $!";
А затем читать через интерфейс Text :: CSV:
my $csv = Text::CSV->new ( { binary => 1 } )
or die "Cannot use CSV: ".Text::CSV->error_diag ();
while (my $row = $csv->getline($text_handle)) {
...
}
или неоптимальное разбиение на запятые:
while (my $line = <$text_handle>) {
my @csv = split /,/, $line;
... # regular work as before.
}
При использовании этого метода данные копируются из скаляра только по одному за раз.