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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> 2 несложных вопроса по Perl'у 
:(
    Опции темы
asmlover
Дата 14.9.2005, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



1) Есть текстовй файл. Допустим я его считал, так вот надо во всех местах последовательность пустых строк сузить до одной пустой строки. Т.е. есть массив строк (считал из текстового файла):

бла-бла-бла
<пустая строка, возможно состоящая из знаковом пробелов табуляции и сивола конца строки>
<еще одна>
<и еще одна>
<и т.д.>
бла-бла-бла

Надо, чтобы получилось так:
бла-бла-бла
< только одна пустая строка>
бла-бла-бла

Если брать просто пустые строки, то сделать это довольно просто. Но как учитывать те, которые состоят из пробелов или знаков табуляции или еще из чего-нибудь невидимого? Подскажите, решение please

2) Как для всех файлов заданной директории вызвать внешнюю программу (cksum) и вывести результат ее работы (для каждого файла ) на экран?

Спасибо
PM MAIL   Вверх
Ivan Kolesnikov
Дата 14.9.2005, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 9.3.2005
Где: г. Новокузнецк

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



1)
Цитата

Но как учитывать те, которые состоят из пробелов или знаков табуляции или еще из чего-нибудь невидимого?

Для этого обычно используют регулярные выражения smile.
Код

if ($s =~ /^\s*$/) {
  print "Пустая строка\n";
};

^ - начало строки;
$ - конец
\s - пробельный символ (в том числе табуляция)
* - 0 или более символов

2)
1. получаешь список файлов в директории
2. для каждого файла формируешь выполняемую команду и выполняешь ее
--------------------
PM MAIL ICQ   Вверх
korob2001
Дата 14.9.2005, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Не знаю на сколько правильно я понял задачу. Я понял это так:
Допустим есть файл:
Код

bla-bla-bla



bla-bla-bla



                    bla-bla-bla          bla-bla-bla             bla-bla-bla




                            bla-bla-bla
                                                                bla-bla-bla


               bla-bla-bla

На выходе мы хотим получить содержимое этого файла в таком виде:
Код

bla-bla-bla

bla-bla-bla

bla-bla-bla bla-bla-bla bla-bla-bla

bla-bla-bla
bla-bla-bla

bla-bla-bla

Если я тебя правильно понял, тогда вот решение:
Код

#!/usr/bin/perl -w
use strict;

my $file = "bla-bla.txt";
my $space = 0;

open(BLA, "< $file") or die $!;
   while ( <BLA> ) {

           s/^\s+//;
           s/\s+$//;
           s/\s+/ /g;

           unless ( /^$/ ) {
                    print "$_\n";
                    $space = 0;
           } else {
                    $space++;
                    next if $space > 1;
                    print "$_\n";
           }
   }
close(BLA);

В данном случае стоит обратить внимание на то, что здесь мы не сохраняем содержимое всего файла в память, т.е. в массив. Потому для данного кода не важно, какого размера будет твой файл, в любом случае мы никогда не загоним в тупик оперативную память.
Да, вот ещё что: В данном примере если первая или несколько первых строк будут пустыми или с пробелами или с табуляцией, то самая первая строка на выходе будет пустой, это не всегда желательно. Если тебе нужно пропустить первые пустые строки и начать вывод именно с не пустой строки, то просто при объявлении переменной $space, инициализируй её значение в 1, т.е. замени строку:
Код

my $space = 0;

на
Код

my $space = 1;

После чего все пустые строки в начале файла будут пропущены.

Это сообщение отредактировал(а) korob2001 - 14.9.2005, 18:05


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
sharq
Дата 14.9.2005, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

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



asmlover
Цитата(asmlover @ 14.9.2005, 12:49)
2) Как для всех файлов заданной директории вызвать внешнюю программу (cksum) и вывести результат ее работы (для каждого файла ) на экран?


Выполнение внешней команды и вывод результатов:
Код

use strict;

my @log = `cksum $file 2>&1`;

print "Log: ";
print '['. localtime(time) .']';
foreach (@log) {
    chomp;
    print " $_" if defined $_;

}





--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
asmlover
Дата 14.9.2005, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ivan Kolesnikov
Цитата
* - 0 или более символов

Спасибо за объяснение. Все сразу понял, кроме этого момента. Что значит - 0 или более символов? Может быть 1 или более символов? smile


korob2001
Спасибо, вроде бы все понял. Но ты немного неправильно понял, что я хотел. В непустых строках пробелы и знаки табуляции удалять не надо ;)


sharq
Спасибо
PM MAIL   Вверх
korob2001
Дата 14.9.2005, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Цитата

Спасибо, вроде бы все понял. Но ты немного неправильно понял, что я хотел. В непустых строках пробелы и знаки табуляции удалять не надо ;)

Тем проще, вот пример без удаления символов пробелов, табуляций в не пустых строках.
Код

#!/usr/bin/perl -w
use strict;

my $file = "bla-bla.txt";
my $space = 1;

open(BLA, "< $file") or die $!;
   while ( <BLA> ) {
           unless ( /^\s*$/ ) {
                    print "$_\n";
                    $space = 0;
           } else {
                    $space++;
                    next if $space > 1;
                    print "$_\n";
           }
   }
close(BLA);

Цитата

Что значит - 0 или более символов? Может быть 1 или более символов?

Нет, всё верно * - 0 и более символов. Это значит что если даже в строка будет абсолютно пуста, т.е. без пробелов и табуляции, то такая строка будет сообтветствовать шаблону /^\s*$/, чего нельзя сказать о таком регулярном выражении /^\s+$/, где + - 1 и более.

Это сообщение отредактировал(а) korob2001 - 14.9.2005, 19:17


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


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

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


 




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


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

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