Slozitejsi nahrazovani retezcu

Pavel Lisy pali na tmapy.cz
Pátek Leden 25 12:40:43 CET 2002


Dobry den 

mořím se již několik hodin se syntaxí (vim funkce nebo perl), ale nemohu
přijít na to jak to vyřešit.

Potřebuji v textovém souboru změnit některé řetězce (datum ve formátu
yyyy-mm-dd). Při konverzi  dat bohužel došlo k tomu, že některé datumy
mají prohozený den a měsíc. Jsem schopen dát dohromady algoritmus, ale
nevím, jak to přepsat do perlu, nebo do vim? Začal jsem ve vim:

Toto je kód z vimu, který funguje
--------------
function! Correctdate(rok, mes, den)
   if rok = 2002
      if mes = 1
         return a:rok . "-" . a:mes . "-" . a:den
      else den <= 12
         return a:rok . "-" . a:den . "-" . a:mes
      endif
   else den <= 12
      return "a:rok . "-" . a:den . "-" . a:mes"
   endif
endfunction

while search("[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]", flags) > 0
   let line = getline(".")
" -------------
" TOTO NEZABÍRÁ, nevím jak předat funkci Correctdate parametry
   let repl = substitute(line, '\(\d\{4}\)-\(\d\{2}\)-\(\d\{2}\)', \
Correctdate(submatch(1),submatch(2),submatch(3)) , "g")
" -------------

   call setline(".", repl)
endwhile

------

Potom jsem se to zkoušel přepsat do perlu, ale nevím, jak docílit toho,
že se mi nahrazující řetězec napřed zpracuje mojí funkcí:

-------
sub correctdate () {
   local $rok=$1;
   local $mes=$2;
   local $den=$3;
   print "$den:$mes:$rok"
}

open(INFILE,"data.sql");
open(OUTFILE,">data.out");

while ( defined($line=<INFILE>) ) {
   $line =~ s/(\d{4})-(\d{2})-(\d{2})/&correctdate($1:$2:$3)/; 
   print OUTFILE $line;
}
close(OUTFILE);
close(INFILE);
---------

Uvítám každý pokus :-)

Pavel

-- 
Pavel Lisy <pali na tmapy.cz>
T-MAPY spol. s r.o., http://www.tmapy.cz
Nezvalova 850, Hradec Kralove, 50003
tel: +420-49-5513335 fax: +420-49-5513371

O mapach vime vse: http://www.tmapserver.cz



Další informace o konferenci Linux