Linux-Bulgaria.ORG
навигация

 

начало

пощенски списък

архив на групата

семинари ...

документи

как да ...

 

 

Предишно писмо Следващо писмо Предишно по тема Следващо по тема По Дата По тема (thread)

Re: lug-bg: Perl system() or exec()


  • Subject: Re: lug-bg: Perl system() or exec()
  • From: Sava Chankov <sava@xxxxxxxxxxxxx>
  • Date: Mon, 07 Mar 2005 11:37:17 +0200

Peter Pentchev wrote:
On Mon, Mar 07, 2005 at 11:10:12AM +0200, Sava Chankov wrote:
Daniel wrote:
Пиша си аз и стигам до частта, където трябва да риплейсна един стринг в текстов файл и то със стандартни инструменти. Написах го с временен файл и базирано на sed. Идеята е някаква такава -
mv file file.tmp;
sed s/^$something.*$/$somethingandsomethingelse/ file.tmp > file
rm file.tmp

Това работи, пишейки го на ръка, но слагайки го в system() пищи. Лудото е,чe $somethingelse съдържа стринг от сорта на "1","2","3" (кавичките са важни), което избягвам затваряйки го в единични кавични в шел, но както споменах - не ще! Пише, че не е терминиран с// оператора. Което е логично, но дори слагайки "командата" във временна променлива и пействайки я в шел-а след парс-а на "перлата" тя РАБОТИ. Имам | - ки в командата, но ги ескейпвам с \\. Дееба. вече ми се спи. Ако се сещате за по-инте(ресен|лигентен) начин за замяна на даден ред от текстов файл - отворен съм. Сед ми се струва бърз и затова се оповах на него. sed2perl не ме кефи.
За тази работа няма нужда да напускаш командния ред:

perl -pi -e 's/^$something.*$/$somethingandsomethingelse/' file

-p assume 'while (<>) { ... }' loop around program but print line
               also, like sed
-i[extension]   edit <> files in place (makes backup if extension supplied)
-e program      one line of program (several -e's allowed, omit programfile)

Доколкото разбирам обаче, той се опитва да го направи като част от друга
програма, и $something и something else са променливи, които получават
сотйности от други парчета на програмата.  Опит за извикване на perl -pi
през system() или exec() ще се сблъска със същите проблеми като опита за
извикване на sed; решението е да се направи всичко вътре в самата
програма :)

Поздрави,
Петър


Да, разбирам какво иска да направи Даниел. Обаче и аз често съм се сблъсквал с проблеми, които изглеждат решими със скрипт на обвивката, но при усложняване на условията стават по-трудоемки за изпълнение и е логично да се потърси по-мощен език. Единият начин е да се отвори текстов редактор и да се напише perl скрипт, разбира се, без такива хватки като извикване на sed със system() или exec(), а
културно да се отвори файла и да се заменя в него (какъвто е твоя пример):

 open(INFILE, '<', $infile) or die "Opening $infile: $!\n";
  $tmpfile = "$outfile.tmp";
  open(OUTFILE, '>', $tmpfile) or die "Opening $tmpfile: $!\n";
  while (<INFILE>) {
    s/^$something.*$/$somethingandsomethingelse/;
    print OUTFILE;
  }
  close INFILE;
  close OUTFILE;
  rename $tmpfile, $outfile or die "Renaming to $outfile: $!\n";

Другият начин - ако кодът, която генерира тези $something и $somethingandsomethingelse е кратичък (примерно три-четири реда), е той да се сложи на командния ред, като по този начин си спестяваш труда да отваряш и затваряш файлове, че и да ги преименуваш - прехвърляш работата на perl. Въпрос на мързел и нетърпение :)

--
Sava Chankov                                     Сава Чанков
research and development                  проучване и развой
http://www.blueboard.biz                         блуборд оод
============================================================================
A mail-list of Linux Users Group - Bulgaria (bulgarian linuxers).
http://www.linux-bulgaria.org - Hosted by Internet Group Ltd. - Stara Zagora
To unsubscribe: http://www.linux-bulgaria.org/public/mail_list.html
============================================================================



 

наши приятели

 

линукс за българи
http://linux-bg.org

FSA-BG
http://fsa-bg.org

OpenFest
http://openfest.org

FreeBSD BG
http://bg-freebsd.org

KDE-BG
http://kde.fsa-bg.org/

Gnome-BG
http://gnome.cult.bg/

проект OpenFMI
http://openfmi.net

NetField Forum
http://netField.ludost.net/forum/

 

 

Linux-Bulgaria.ORG

Mailing list messages are © Copyright their authors.