Come passare una variabile AppleScript allo script Perl?

1

Ho uno script Perl che esegue una trasformazione del testo su un determinato file.

Ora vorrei chiamare questo script da un AppleScript che a sua volta potrei eseguire dal menu dello script per eseguire lo script Perl su un set di file con un prompt di scelta della cartella. Il mio script Perl inizia così:

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

E poi un po 'di ricerca e sostituzione e cosa no.

Vorrei in qualche modo chiamare questo script da un AppleScript ed elaborare più file. AppleScript dovrebbe apparire più o meno come questo:

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

Come posso eseguire lo script Perl da AppleScript mentre passo myFiles come variabile (lo script perl) e scorrerli? Suppongo di dover eseguire un comando do shell script ma non so come passare le variabili.

Inoltre non so se sarebbe meglio passare i file come file list a perl o in qualche modo inserirlo in un loop ripetuto all'interno di AppleScript?

    
posta jan 13.05.2016 - 08:34
fonte

2 risposte

1

Finalmente l'ho capito:
Posso ottenere ciò che voglio usando l'array $ARGV che contiene tutti gli argomenti che vengono passati allo script perl tramite la riga di comando. In un applescript posso semplicemente mettere questa riga:

do shell script "perl myscript.pl inputfile outputfile"

Supponendo inputfile e ouputfile sono i (percorsi verso) i file su cui voglio eseguire lo script perl. Quindi chiamo inputfile con $ARGV[0] (il primo argomento passato) e outputfile con $ARGV[1] (il secondo argomento).

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

Spero che questo sia utile a qualcuno.

    
risposta data 21.05.2016 - 15:32
fonte
1

La lunghezza massima di una riga di comando è 2**18 byte:

$ getconf ARG_MAX
262144

Così, ad esempio, questo si traduce in un errore:

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

Se l'input è abbastanza breve, puoi passarlo a perl come parte della riga di comando:

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

Altrimenti puoi usare un file temporaneo:

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 codifica di testo predefinita è ancora una codifica come MacRoman o MacJapanese, quindi l'aggiunta di as «class utf8» al comando write conserva i caratteri non ASCII, anche se non è necessario nell'esempio sopra.

Nel tuo caso potresti anche fare qualcosa di simile:

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

quoted form of esegue l'escape del testo per le shell, in modo che sostituisca ' con '\'' e circonda il testo con virgolette singole.

    
risposta data 13.05.2016 - 19:04
fonte

Leggi altre domande sui tag