Re: lug-bg: Perl system() or exec()
- Subject: Re: lug-bg: Perl system() or exec()
- From: Peter Pentchev <roam@xxxxxxxxxxx>
- Date: Mon, 7 Mar 2005 12:34:16 +0200
On Mon, Mar 07, 2005 at 11:37:17AM +0200, Sava Chankov wrote:
> 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.
> Въпрос на мързел и нетърпение :)
Проблемът не е толкова в генерирането им, колкото в подаването им през
шела към... към......
(!)
(and then he was enlightened ;)
Аааааааааа, мисля, че разбрах какво имаш предвид - или поне ми се струва,
че е така :) Ако имаш предвид нещо като...
perl -pi -e '$something="blah"; $somethingelse="neshto po-slozhno"; s/^$something/$somethingelse/"' filename
...това спокойно може и да сработи :)
А ако изчисляването на $something и $somethingelse не е нещо тривиално,
а има смисъл да бъде направено само веднъж, тогава...
perl -pi -e 'BEGIN { $something="blah"; $somethinglese="furrfu"; } s/^$something.*\$/$somethingelse/g'
Май тук му е мястото да кажа нещо за мощта на Perl, ама няма :P
(най-малкото защото поне някои хора знаят, че не съм съвсем безпристрастен ;)
Поздрави,
Петър
--
Peter Pentchev roam@xxxxxxxxxxx roam@xxxxxxxx roam@xxxxxxxxxxx
PGP key: http://people.FreeBSD.org/~roam/roam.key.asc
Key fingerprint FDBA FD79 C26F 3C51 C95E DF9E ED18 B68D 1619 4553
No language can express every thought unambiguously, least of all this one.
Attachment:
pgpvmK0lt55fP.pgp
Description: PGP signature
|