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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вставить текст после абзаца 
V
    Опции темы
gcc
Дата 20.11.2009, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

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



нужно вставить текст после конкретного абзаца в файле, и чтобы этот текст входил в этот обзац

т.е. как вставить строку после 8 абзаца?

===

не могу найти, абзацы подсчитать могу, но вставить в этот обзац не получается
Код

$/='';          # Включить режим чтения абзацев
open(FILE, $file) or die "can't open $file: $!";
1 while <FILE>;
$para_count = $.;




Код

$count += tr/\n/\n/ while sysread(FILE, $_, 2 ** 16);


Это сообщение отредактировал(а) gcc - 20.11.2009, 21:57
PM WWW ICQ Skype GTalk Jabber   Вверх
DEER
Дата 20.11.2009, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

$count += s/\n/ТЕКСТ\n/ while sysread(FILE, $_, 2 ** 16);

не подходит?


--------------------
 
PM MAIL WWW ICQ MSN   Вверх
gcc
Дата 20.11.2009, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

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



не хочет

Код

#!/usr/bin/perl

$count += s/\n/ТЕКСТ\n/ while sysread(FILE, 'shiz.txt', 2 ** 16);

exit;


====

абзацев штук 20, нужно вставить после 8 абзаца, найти его надо (строки все время добавляються), я его нашел скриптами выше, но вставляет оно перед абзацеи, а после абзаца не хочет, я пытался открыть "бинарно" файл и обработать , но пока не получается

вообще-то нужно вставить после 8 абзаца и после 14...

Добавлено через 44 секунды
в гугле что-то нету

http://www.google.com.ua/#hl=uk&q=perl...f5056a779b927eb
PM WWW ICQ Skype GTalk Jabber   Вверх
gcc
Дата 21.11.2009, 01:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

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



подскажите, почему когда я пытаюсь написать 

Код

.......
   syswrite(F, "fffffff\n", 459,б 10);
.....



он пишет 
Offset outside string at ./shiz.pl line 95.

PM WWW ICQ Skype GTalk Jabber   Вверх
gcc
Дата 21.11.2009, 03:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

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



подскжаите почему данный код
Код

#!/usr/bin/perl

#open (F1, "+<shiz.txt") or die $!;

# select F; 
# local $SIG{ALRM} = sub { die "__alarm__\n" };
#select STDOUT;
# seek F,461,1;

 sysopen Fl, "shiz.txt", OJRDWR;

# binmode (F1);

$read = sysread Fl, $string, 14;
$position = sysseek Fl, 461, 1;
$string = "GGGGGGGGGGG"; 

syswrite Fl, $string, length($string);

warn "Прочитано $read байт вместо 14\n" if $read != 14;

die "sdss:: $!\n" if $written != length($string); # Закрытие файла

close Fl or die $!;




выдает ошибку и не записывает

Код

sdss:: Bad file descriptor



на эту строку, я так понял die "sdss:: $!\n" if $written != length($string); # Закрытие файла
PM WWW ICQ Skype GTalk Jabber   Вверх
Bulat
Дата 21.11.2009, 16:06 (ссылка) |   (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


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

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



gcc, мне кажется это "железной головой" не решить.. Во-первых нужно обратиться к функциям tell и seek - это конкретная позиция в файле, возможно есть смысл изучить как в файле ообозначется новый абзац, возможно, символ "\n" и "\s" (пробел) - более чем один раз.. присваиваешь local $/ = <необходимый набор символов> и считываешь поабзацно файл  smile 

Вообщем-то, на мой взгляд - без доли эвристики не обойтись smile



--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
gcc
Дата 21.11.2009, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

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



понятно, я вот нашел http://www.spravkaweb.ru/perl/print#truncate сделал не много по другому, результат другой

обзац подсчитал, вывел tell байт переместился туда на seek и +-1 байт

интересно, а почему syswrite не работает? 

я взял пример из книги (из документации одинаковая:
http://www.realcoding.net/teach/perl/7/Index2.htm 
http://valera.asf.ru/perl/book/6/6.4.html  
http://stfw.ru/page.php?id=4066 )

(я думал что синтаксическая ошибка в скрипте, но не нашел ее)



Это сообщение отредактировал(а) gcc - 21.11.2009, 23:42
PM WWW ICQ Skype GTalk Jabber   Вверх
amg
Дата 22.11.2009, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(gcc @  20.11.2009,  21:48 Найти цитируемый пост)
нужно вставить текст после конкретного абзаца в файле, и чтобы этот текст входил в этот обзац
Я так и не понял, решена задача или нет? Если нет, то вот:
Код
$/='';          # Включить режим чтения абзацев
open(FILE, $file) or die "can't open $file: $!";
while (<FILE>) {
  s/$/$string/ if $.==8;
}

PM MAIL   Вверх
gcc
Дата 23.11.2009, 07:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

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



amg, сори, забыл написать что написал

подскажите как сделать чтобы файл заблокировать? чтобы скрипт одновременно не открыл файл перед чтение и перед записью?

функция read не читаете если файл открыт для записи!! ">" по этому приходиться сначало открыть, потом закрыть, потом опять открыть и закрыть (3 раз тут я еще открыл чтобы найти абзац)


нужно заблокирвоать первый раз после open для чтения? или нет?  а после записи открыть просто?


Код

#!/usr/bin/perl -w

use Fcntl ':flock';

##
# to insert a line after an indention
#

###
#
# Example: ./perl.pl 'bla-bla'

# Filename
$file = 'netams.cfg';

# абзац перед которым вставить(на 1 меньше)
# indention before which to insert
$indention = 4;

# $ARGS[0] line which to insert "bla-bla "  ./perl.pl 'bla-bla'

$ARGV[0] = 'bla-bla' if ( !@ARGV || !$ARGV[0] );

# File Locking:
#
# http://perldoc.perl.org/functions/flock.html
# http://www.pageresource.com/cgirec/ptut15.htm

$/ = ''
  ; # Включить режим чтения абзацев - To set mode reading of indentions
open( F, $file ) or die "can't open $file: $!";
while (<F>) {

    if ( $. == $indention ) {
        $seeked = (tell) - 1; # на 1 байт вверх
        last;

    }
}
close F;

open( F, $file ) or die "can't open $file: $!";

seek F, 0, 2;
$ttel = tell;

seek F, $seeked, 0;
read F, $recl2, $ttel;

close F;

open( F, "+<" . $file ) or die "can't open $file: $!";

#     flock( LOG, LOCK_EX );
seek F, $seeked, 1;
truncate F, $seeked;
print F $ARGV[0] . "\n";
print F $recl2;

#    flock( LOG, LOCK_UN );

close F;

exit;







Это сообщение отредактировал(а) gcc - 23.11.2009, 14:45
PM WWW ICQ Skype GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Регулярные выражения | Следующая тема »


 




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


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

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