[Perl] Oracle y Perl
Gunnar Wolf
gwolf en gwolf.org
Jue Dic 15 16:00:15 CST 2005
sysadmin dijo [Thu, Dec 15, 2005 at 01:19:38PM -0400]:
> Hola lista, como andan.... espero que bien, les pregunto lo siguiente como
> se podria hacer que dentro de un script perl pueda hacer el llamado a una
> sentencia del oracle exp ???
>
> Asi tengo colocado dentro de mi script
>
> if ($ciclo == 1){
> print `exp usuario/pass en db file=backup$(date +%d%m%y%H%M).dmp`;
> print "\n El Backup Termino Correctamente \n";
> }
>
> Y estos son los errores que me tira
>
> sh: -c: line 1: syntax error near unexpected token `)'
> sh: -c: line 1: `exp usuario/pass file=backup$date(+%d%m%y%H%M).dmp'
>
> y nose como solucionarlo, si me podrian dar una mano estaria agradecido
>
> Saludos desde paraguay !!!
El que se está quejando ahí no es Perl, sino que tu shell - Perl está
pasando correctamente lo que está entre comillas inversas al shell
para ejecución (con una salvedad, ahora voy para allá), pero tienes
que escapar ciertos caracteres, que tienen significado especial.
Primero que nada, dices usuario/pass en db - Acá Perl intenta interpolar
al arreglo @db. La primer alternativa sería indicarle a Perl que esa
es una arroba textual, escapándola con \, de modo que quede
usuario/pass\@db
En segundo lugar, tienes algo muy parecido con el signo $ - Perl cree
que estás hablando de la variable especial $(, que tiene el GID real
del proceso (perldoc perlvar). Para tu segundo argumento, el shell
está recibiendo algo similar a "1000date +%d%m%y%H%M).dmp" - y el
paréntesis que cierra ante uno que nunca abrió lo desconcierta. Misma
receta: Lo puedes escapar, quedando en
"file=backup\$(date +%d%m%y%H%M).dmp"
Pero mejor aún, evítate esos problemas :) Si no estás usando la salida
del comando para procesarla posteriormente (como sería, por ejemplo,
llamar desde Perl un $fecha=`date +%d%m%y%H%M`), mejor usa la función
system() y ahórrate broncas. Puedes hacerlo pasándole una cadena a
secas, o -te lo recomiendo siempre que puedas- dar cada argumento como
una cadena separada, evitando las broncas que te puede dar a veces el
IFS del shell. En pocas palabras, mejor haz esto:
if ($ciclo == 1){
system('exp','usuario/pass en db','file=backup$(date +%d%m%y%H%M).dmp');
print "\n El Backup Termino Correctamente \n";
}
(¿que por qué acá no escapo la @ y el $? Porque las comillas simples
no interpolan, a diferencia de las comillas dobles o inversas)
Saludos,
--
Gunnar Wolf - gwolf en gwolf.org - (+52-55)1451-2244 / 5623-0154
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973 F800 D80E F35A 8BB5 27AF
Más información sobre la lista de distribución Perl