Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Регулярные выражения > вставить текст после абзаца


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

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

===

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

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




Код

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

Автор: DEER 20.11.2009, 22:03
Код

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

не подходит?

Автор: gcc 20.11.2009, 22:09
не хочет

Код

#!/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+%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%B8%D1%82%D1%8C+%D1%82%D0%B5%D0%BA%D1%81%D1%82+%D0%BF%D0%BE%D1%81%D0%BB%D0%B5+%D0%B0%D0%B1%D0%B7%D0%B0%D1%86%D0%B0&start=0&sa=N&fp=bf5056a779b927eb

Автор: gcc 21.11.2009, 01:53
подскажите, почему когда я пытаюсь написать 

Код

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



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

Автор: gcc 21.11.2009, 03:53
подскжаите почему данный код
Код

#!/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); # Закрытие файла

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

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

Автор: gcc 21.11.2009, 23:38
понятно, я вот нашел 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 )

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


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

Автор: gcc 23.11.2009, 07:06
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;






Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)