Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> find\replace для бинарных файлов, поиск и замена байтов в бинарном файле 
V
    Опции темы
bamper
  Дата 31.3.2008, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 31.3.2008

Репутация: нет
Всего: нет



Здравствуйте. Вот мучаюся с программой. Задача: есть набор файлов, в них найти и заменить байты 0D 0A на 25 0D 0A.
Вот что я написал:

Код

use FileHandle;
use strict;

# --- Получение списка файлов в папке и сохранение их в массиве
my $file;
my @filelist;
opendir(Dir, $ARGV[0]) || die;
print "--- Parser for EDI files ---\n\n";
print "Folder: $ARGV[0] \n";

while ($file = readdir(Dir))
        {
                if (($file ne '.') && ($file ne '..')) 
        { push (@filelist, $file); }
        }
closedir(Dir);

# --- Обработка Фалов
print "Files: \n";
foreach $file (@filelist)
    {
    print "  $file \n";

    my $fd;
    sysopen($fd, $ARGV[0].$file, O_RDWR) or die "Can't open file: $! \n";
    binmode($fd) or die "Cant binmode file: $! \n";

    my $content='';
        {
            local $/; 
            $content=<$fd>;
        }
        
    $content=~s#\x0D\x0A#\x25\x0D\x0A#g;

    print (fd "$content");  
    close($fd) or die "Can't close file: $! \n";
    }

print "\n Job Completed!\n";
system pause


но как это часто бывает - неработает... Подскажите что сделал не так.
Спасибо!..
PM MAIL   Вверх
nitr
Дата 31.3.2008, 23:06 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



Блок замены можно заменить на:
Код

...
open my $fd, '+<', $ARGV[0].$file or die "Can't $ARGV[0]$file";
binmode $fd;

local $/;
my $content = <$fd>;
$content =~ s#\x0D\x0A#\x25\x0D\x0A#g;

seek $fd, 0, 0;
print $fd $content;
close $fd;
...



--------------------
PM   Вверх
bamper
Дата 1.4.2008, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 31.3.2008

Репутация: нет
Всего: нет



Цитата(nitr @ 31.3.2008,  23:06)
Блок замены можно заменить на:
Код

...
open my $fd, '+<', $ARGV[0].$file or die "Can't $ARGV[0]$file";
binmode $fd;

local $/;
my $content = <$fd>;
$content =~ s#\x0D\x0A#\x25\x0D\x0A#g;

seek $fd, 0, 0;
print $fd $content;
close $fd;
...

спасибо. все заработало!  smile 
PM MAIL   Вверх
amg
Дата 1.4.2008, 09:30 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



bamper, как сложно! Это же перл!
Например, получение списка файлов можно сделать одной строкой, и ущерба для читабельности кода не будет, скорее наоборот.
Код

my @filelist = grep { -f } <$ARGV[0]*>;


И вообще, с Вашей задачей справится (вроде бы, я не проверял) простейшая "программа", набранная в командной строке
Код

perl -i -pe "s/$/\x25/" dir_name


PM MAIL   Вверх
bamper
Дата 1.4.2008, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 31.3.2008

Репутация: нет
Всего: нет



Цитата(amg @ 1.4.2008,  09:30)
bamper, как сложно! Это же перл!
Например, получение списка файлов можно сделать одной строкой, и ущерба для читабельности кода не будет, скорее наоборот.
Код

my @filelist = grep { -f } <$ARGV[0]*>;


И вообще, с Вашей задачей справится (вроде бы, я не проверял) простейшая "программа", набранная в командной строке
Код

perl -i -pe "s/$/\x25/" dir_name

хе. прям для рекламы перла можно брать: "зачем все усложнять? есть же перл!.."
ну просто опыт в програмировании perl`а у меня - со вчерашнего дня. 
и мой код был написан в основном по теории из литературы что я нашел. 
ваше же мнение постороенно на опыте - что и дает вам возможность находить 
более рациональные решение. в любом случае спасибо за помощь. 
очень признателен.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0507 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.