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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выборочное изменение файлов в директории 
:(
    Опции темы
alyam
Дата 14.9.2011, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Простите, что может быть вопросы нубские задаю. Помогите программку составить. Сам книжку по перлу не открывал лет 10. забыл все.
Задача такая: в выбранной директории (вместе с поддиректориями) изменить 2 строчку во всех файлах, кроме файлов, начинающихся с 89. С изменением строчки все ОК. Не могу составить регулярное выражение для выборки нужных конкретных файлов
Структура файлов примерно такая:
C:/111/DAT_1107.230/001.07
C:/111/DAT_1107.230/001.08
C:/111/DAT_1107.230/001.11
C:/111/DAT_1107.230/002.01
C:/111/DAT_1107.230/002.02
C:/111/DAT_1107.230/002.03
C:/111/DAT_1108.230/012.10
C:/111/DAT_1108.230/012.11
C:/111/DAT_1108.230/89.01
C:/111/DAT_1108.230/89.11

#!/usr/bin/perl -w

sub replace_line {
my ($file) = @_;
    open(FILE,"<$file") or die "Can't open $file: $!";
    @content = <FILE>;
    close(FILE);
    return if 2>@content;
    substr($content[1],-4,0)="89";
    open(FILE,">$file") or die "Can't open for write $file: $!";
    print FILE @content;
    close(FILE);
}


sub scan_dir
# процедура рекурсивного сканирования папки
{

    my ($dir) = @_;
    my @list;
    for my $file (glob($dir.'/*'))
    {

        if ($file=~ /0\d{2}\.\d{2}$/) { push @list, $file; next} # добавляем в массив 1 элемент
        if (-d $file) # если файл является папкой
        {
            pop @list, $file;
            my @sub = scan_dir($file);
            push @list, @sub;

        }

    }
    return @list;

}

# имя папки для сканирования по умолчанию (. = текущая папка)
my $dir='C:/111';


# вызов процедуры сканирования содержимого папки
@list = scan_dir($dir);

foreach $i (@list) {
replace_line($i)
}


Это сообщение отредактировал(а) alyam - 14.9.2011, 10:02
PM MAIL   Вверх
Jimy
Дата 14.9.2011, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код

if ($file !~ /^89/) { push @list, $file; next}

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


Шустрый
*


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

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



Цитата(Jimy @ 14.9.2011,  10:52)
Код

if ($file !~ /^89/) { push @list, $file; next}

нифига так не работает. потому что $file='C:/111/DAT_1107.230/89.07' оно не начинается с 89!
PM MAIL   Вверх
Jimy
Дата 14.9.2011, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Прошу прощения, не внимательно посмотрел код. Привык работать с файлами через readdir который возвращает только имя файла.
Ну тогда как-то так:

Код

$file !~ /\/89\.[^\/]*$/


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


Шустрый
*


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

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



а если усложнить задачу и переименовывать файлы, которые не начинаются с 89. В общем нужно в название файла вначале добавить 89. 
PM MAIL   Вверх
Ramirez
Дата 22.10.2011, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 18.1.2005
Где: Moscow, ExUSSR

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



а не хотите File::Find использовать?
сразу получите и путь к папке и имя файла отдельно.
проверять и оперировать проще:

Код

#!perl
use strict;
use File::Find;
find(\&wanted, 'c:\temp\dat');

sub wanted {
    return unless -f $File::Find::name;
    processfile($File::Find::name) unless $_ =~ /^89/;
    renamefile($File::Find::name) if $_ =~ /^89/;
}

sub renamefile {
    my $file = shift;
    warn 'Rename ',$file;    
}

sub processfile {
    my $file = shift;
    warn 'Process ',$file;
    # replace strings
}

PM ICQ   Вверх
mishin
Дата 18.11.2011, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



не надо File::Find; использовать
только
Код

use File::Slurp qw( :std );
my $path_to_files = 'C:/111/';

my @files = read_dir( $path_to_files, prefix => 1 );
my @needed_files = grep {!/^89/} @files;
#done



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


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

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


 




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


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

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