Как я могу быстро исправить управляющие символы EBCDIC в больших файлах, используя Perl? - PullRequest
1 голос
/ 29 сентября 2010

Приношу свои извинения, если это звучит как вопрос новичка.Я не являюсь разработчиком Perl, но пытаюсь использовать его в процессе автоматизации, и я столкнулся с проблемой.

Следующая команда быстро выполняется (несколько секунд) в моей системе Linux (Ubuntu 9.10x64, Perl 5.10), но очень медленный в системе Windows (Windows 2003 x86, Strawberry Perl 5.12.1.0).

perl -pe 's/\x00\x42\x00\x11/\x00\x42\x00\xf0/sgx' inputfile > outputfile

Шаблон для поиска / замены шестнадцатеричных символов предназначен для исправления управления кареткой EBCDICсимволов в файле размером от 500 МБ до 2 ГБ.Я не уверен, что это даже самый эффективный способ сделать это, но, похоже, он сработает ... если только он будет работать быстро в системе Windows, на которой он должен работать.

Есть мысли?

1 Ответ

3 голосов
/ 30 сентября 2010

Обратите внимание, что в Windows существует различие между текстовыми и двоичными файлами.Текстовые файлы подлежат автоматическому преобразованию EOL, которое, как я полагаю, может добавить к времени выполнения, а также может испортить вашу двоичную замену (вероятно, не в этом случае).* с помощью этой замены.

Я думаю, что суть дела сводится к следующему: с помощью переключателя -p вы должны обрабатывать ввод построчно.Где находится первый EOL (как понимается perl) в файле?Вы пытаетесь прочитать огромную строку в память, сделать s/// на ней и записать?

Как насчет использования следующего сценария:

#!/usr/bin/perl

use strict; use warnings;
$/ = "\x00\x42\x00\x11";
$\ = "\x00\x42\x00\xf0";

while ( <> ) {
    chomp;
    print;
}

Кроме того, вам абсолютно необходимоиспользуйте двойные кавычки в Windows.Сравните и сопоставьте:

C:\Temp> perl -pe 's/perl/merl/' t.pl
#!/usr/bin/perl
...
C:\Temp> perl -pe "s/perl/merl/" t.pl
#!/usr/bin/<b><i>merl</i></b>
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...