Bir AppleScript değişkeni Perl betiğine nasıl geçirilir?


1

Belirli bir dosya üzerinde bazı metin dönüşümleri yapan bir Perl betiğim var.

Şimdi bu betiği, bir Perl betiğini bir klasör seçimi komutuyla çalıştırmak üzere bir dizi dosya üzerinde çalıştırmak için betiğinden yürütebileceğim bir AppleScript'ten çağırmak istiyorum. Perl betiğim şöyle başlıyor:

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

Ve sonra bir grup ara ve değiştir ve ne yapmıyor.

Bir şekilde bu betiği bir AppleScript'ten çağırmak ve birden çok dosyayı işlemek istiyorum. AppleScript az çok şöyle görünmelidir:

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

Perl betiğini AppleScript'ten geçerken nasıl çalıştırabilirim myFiles Bir değişken olarak (perl betiği) ve onların arasında döngü? Sanırım yapmak zorundayım do shell script komut ama değişkenleri nasıl geçireceğimi bilmiyorum.

Ayrıca dosyaları perl olarak mı yoksa bir şekilde AppleScript içinde tekrarlanan bir döngüye sokmanın dosya listesi olarak mı geçirmenin daha iyi olacağını bilmiyorum?

Yanıtlar:


1

Bir komut satırının maksimum uzunluğu 2**18 bayt:

$ getconf ARG_MAX
262144

Bu nedenle örneğin bu bir hatayla sonuçlanır:

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

Giriş yeterince kısaysa, komut satırının bir parçası olarak perl'e iletebilirsiniz:

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

Aksi takdirde geçici bir dosya kullanabilirsiniz:

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

Varsayılan metin kodlaması hala MacRoman veya MacJapanese gibi bir kodlamadır; as «class utf8» -e write komutu, yukarıdaki örnekte gerekli olmasa bile ASCII olmayan karakterleri korur.

Senin durumunda da böyle bir şey yapabilirsin:

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

quoted form of kabukları için metinden kaçar, böylece ' ile '\'' ve metni tek tırnak işaretleriyle çevreler.


Bunun için teşekkür ederim! Sizden biraz genişlemenizi isteyebilir miyim? Perl betiğim oldukça karmaşık olduğundan kesinlikle daha uzun sürüme ihtiyacım olacak. Ama nasıl diyebilirim (yani, perl betiğine giden yolu nereye koyacağım)? Ve girişi tanımak için betiği nasıl değiştirebilirim? (perl betiğinin içinde "myfile.txt" yerine ne yazmalıyım?) Bu daha deneyimli bir kullanıcı için açıkça görüldüğü için özür dilerim, ama ne elma ne de perl'de çok iyi değilim.
jan

1

Sonunda anladım:
İstediğim şeyi kullanarak başarabilirim $ARGV perl betiğine iletilen tüm argümanları komut satırı üzerinden tutan dizi. Bir el yazmasında basitçe bu satırı koyabilirim:

do shell script "perl myscript.pl inputfile outputfile"

varsayarsak inputfile ve ouputfile perl betiğini çalıştırmak istediğim dosyalar (yolların). Sonra ararım inputfile ile $ARGV[0] (ilk tartışma geçti) ve outputfile ile $ARGV[1] (ikinci argüman).

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

Umarım bu birisi için yararlı olacaktır.


Cevabınızın anahtar kısmı açıkça belirtilmelidir: •• return •• Argümanları, istenen kabuk betiğini arama satırına tam olarak komut satırında kullanılacağı şekilde yerleştirmeniz gerekir. perl myscript.pl arg1 arg2 ....
daniel Azuelos

@danielAzuelos Biraz değiştirdim, umarım şimdi daha açıktır. Ama lütfen, devam edin ve gerekli olduğunu düşünüyorsanız, arka plan için kullanılabilecek şekilde düzenleyin. Ben bu konuda uzman değilim, bu yüzden doğru kelimelere nasıl sokacağınıza dair herhangi bir ipucu çok açığız.
jan

1
Daha açık :).
daniel Azuelos

@ danielAzuelos Hızlı soru: Kişinin kendi cevabını doğru cevap olarak işaretlemesi kötü bir uygulama olarak mı kabul edilir? Zaten başka biri cevap verdiğinden beri bu cevap aradığım şey değildi. (sadece "cevapsız" olarak gösterilmemesi için)
jan

1
Eğer memnun iseniz Tamamen Tamam. Çoğu zaman iyi arama yapan budur. Diğer cevap gerçekten yararlı değil.
daniel Azuelos
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.