¿Cómo pasar una variable de AppleScript al script de Perl?

1

Tengo un script de Perl que realiza una transformación de texto en un archivo determinado.

Ahora me gustaría llamar a este script desde un AppleScript que, a su vez, podría ejecutar desde el menú del script para ejecutar el script Perl en un conjunto de archivos con un indicador de elegir carpeta. Mi script en Perl comienza así:

open my $in, '<', 'myfile.txt' or die "No input: $!";
open my $out, '>', 'myfile-modified.txt';

Y luego hace un montón de buscar y reemplazar y qué no.

Me gustaría llamar a esta secuencia de comandos desde un AppleScript y procesar varios archivos. El AppleScript debería verse más o menos así:

set myFolder to choose folder with prompt "Choose a folder:"
tell application "Finder"
    try
        set myFiles to (every file in entire contents of myFolder whose name ends with ".txt") as alias list
    on error
        try
            set myFiles to ((every file in entire contents of myFolder whose name ends with ".txt") as alias) as list
        on error
            set myFiles to {}
            display dialog "No files in folder."
        end try
    end try
end tell

¿Cómo puedo ejecutar el script Perl desde AppleScript al pasarle myFiles como variable (el script Perl) y hacer un bucle a través de ellos? Supongo que tengo que ejecutar un comando do shell script pero no sé cómo pasar las variables.

Tampoco sé si sería mejor pasar los archivos como una lista de archivos a perl o poner de alguna manera eso en un ciclo de repetición dentro de AppleScript.

    
pregunta jan 13.05.2016 - 08:34

2 respuestas

1

Finalmente lo descubrí:
Puedo lograr lo que quiero usando la matriz $ARGV que contiene todos los argumentos que se pasan al script perl a través de la línea de comandos. En un applecript simplemente puedo poner esta línea:

do shell script "perl myscript.pl inputfile outputfile"

Suponiendo que inputfile y ouputfile son las (rutas a) los archivos en los que quiero ejecutar el script perl. Luego llamo a inputfile con $ARGV[0] (el primer argumento pasado) y outputfile con $ARGV[1] (el segundo argumento).

open my $fh_in, '<', $ARGV[0] or die "No input: $!";
open my $fh_out, '>', $ARGV[1] or die "No output: $!";

Espero que esto le sea útil a alguien.

    
respondido por el jan 21.05.2016 - 15:32
1

La longitud máxima de una línea de comando es 2**18 bytes:

$ getconf ARG_MAX
262144

Para que, por ejemplo, esto resulte en un error:

read "/usr/share/dict/web2" for 270000
do shell script "printf %s " & quoted form of result

Si la entrada es lo suficientemente corta, puede pasarla a perl como parte de la línea de comando:

read "/usr/share/dict/web2" for 260000
do shell script "printf %s\\n " & quoted form of result & "|perl -pe'$_=uc'"

De lo contrario, puedes usar un archivo temporal:

set input to read "/usr/share/dict/web2" for 270000
set f to (system attribute "TMPDIR") & "my.tempfile"
set fd to open for access f with write permission
set eof fd to 0
write input to fd as «class utf8»
close access fd
do shell script "perl -pe'$_=uc' " & f & ";rm " & f

La codificación de texto predeterminada sigue siendo una codificación como MacRoman o MacJapanese, por lo que agregar as «class utf8» al comando write conserva caracteres no ASCII, aunque no es necesario en el ejemplo anterior.

En tu caso, también podrías hacer algo como esto:

quoted form of POSIX path of (choose folder)
do shell script "find " & result & " -name \*.txt|perl -pe'$_=uc'"

quoted form of escapa el texto de los shells, de modo que reemplaza ' con '\'' y rodea el texto con comillas simples.

    
respondido por el nisetama 13.05.2016 - 19:04

Lea otras preguntas en las etiquetas