Emulando arrays asociativos en AppleScript

4

Un problema que sería trivial resolver con pares clave = valor & gt ;. Para cada elemento en list_a, encuentre el elemento coincidente en list_b y compare un solo atributo (calcule la relación de escala para dos conjuntos de imágenes).

Las listas de AppleScript tienen este aspecto:

listA = {{filename:"filename X.tif",width:"500"},{filename:"filename Z.tif",width:"200"}, ...}
listB = {{filename:"filename Z.tif",width:"400"},{filename:"filename v.tif",width:"222"}, ...}

Ambas listas pueden contener un número diferente de artículos / orden, lo que hace imposible transmitir el nth item of list para seleccionar pares

Aunque sería posible iterar sobre cada objeto en la lista A y comparar su propiedad de nombre de archivo con cada objeto de la lista B, esto es terriblemente ineficiente, incluso con unos pocos cientos de elementos.

¿Es posible resolver esto utilizando AppleScript o debo serializar los objetos y pasar la tarea de evaluación a un script externo que admita assoc? arrays?

    
pregunta cjoy 15.08.2013 - 15:24

3 respuestas

2

Aunque AppleScript tiene matrices asociativas, se llaman "registros". Intenté usar los registros de AppleScript para darle una solución. En el código a continuación, no pude usar una cadena como clave. Me las arreglé para usar algo que se parece a un nombre de archivo, un identificador, pero esto realmente no funciona. Sin embargo, es una idea de cómo usar una matriz asociada en AppleScript:

set theAssociativeArray to {|file name 3.jpg|:{width:400}, |file name 1.jpg|:{width:222}}

-- looking things up by key in an AppleScript record, which is really a dictionary, is fast
try
    get |file name3.jpg| of theAssociativeArray
    say "file name 3 is on list"
on error
    say "file name 3 is not on list"
end try
try
    get |file name 1.jpg| of theAssociativeArray
    say "file name 1 is on list"
on error
    say "file name 1 is not on list"
end try

Vi que en tu código de ejemplo, definiste listas de registros. Lo que intenté hacer es definir registros de registros.

Creo que lo más importante a tener en cuenta acerca de las fortalezas y debilidades de AppleScript es que es un lenguaje diseñado para la Comunicación de Interapplicación (IAC), que gira en torno al "comando tell" para decirle a las diferentes aplicaciones que obtengan datos. datos, y para controlar las aplicaciones diciéndoles comandos.

Aquí hay un enlace a una respuesta que creo que es relevante para una solución AppleScript para usted:

Encontrando la intersección de dos Listas

La solución definitiva que utiliza AppleScript sería utilizar AppleScriptObjC, que le permitiría usar clases de Objective-C, como NSDictionary, que son muy parecidas a matrices asociativas.

    
respondido por el Kaydell 16.08.2013 - 11:04
3

Si puede usar un script de shell (o do shell script ), awk admite matrices asociativas con claves de cadena y búsqueda rápida.

$ cat widths.txt
2.tif 600
1.tif 500
4.tif 700
$ cat heights.txt
4.tif 1000
2.tif 900
$ awk 'NR==FNR{a[$1]=$2;next}{print $1" "a[$1]/$2}' widths.txt heights.txt
2.tif 0.666667
4.tif 0.7
    
respondido por el user495470 16.08.2013 - 11:50
0

En realidad, ES posible que su primer script escriba un segundo script y ejecute el segundo script 'dentro del otro', lo que le permite escribir claves 'sobre la marcha'. Aquí hay una divertida demostración que juega con el concepto. Espero que te ayude!

--WRITE KEYS TO 'ASOCIATIVE ARRAYS' on theFLY!!!! (a.k.a. applescript 'records') --THIS SCRIPT RANDOMLY GETS A KEY TO EXTRACT A VALUE FROM THE APPLESCRIPT RECORD --THE COOL PART IS THAT IT ALSO GENERATES THE NAME OF THE RECORD --AND THE NAME OF THE LAST KEY IN THE RECORD!!!!!!!!! set USE_ANY_NAME_YOU_LIKE to "double_Oh_7" --try 'MonkeyPenny' or 'Q' or 'double_Oh_7' set RANDUMB_VARIABLE to some item of {"JaymsBond", "secret_Messij", USE_ANY_NAME_YOU_LIKE} set EMBEDEDSCRIPT to " on run(xxx) beep 3 say \"I'm accessing the associative arrays,\" &xxx &\"key.\" return " & RANDUMB_VARIABLE & " of {JaymsBond:007, secret_Messij:\"shaken not stirred\"," & RANDUMB_VARIABLE & ":\"yep\"} end" set z to run script EMBEDEDSCRIPT with parameters {RANDUMB_VARIABLE} return "The value of the " & RANDUMB_VARIABLE & " key is ... " & z

--result 1 > > > "El valor de la clave double_Oh_7 es ... yep" --result 2 > > > "El valor de la clave JaymsBond es ... 7" --resultado 3 > > > "El valor de la clave secret_Messij es ... agitado no revuelto"

    
respondido por el Mr. Science 25.04.2016 - 21:52

Lea otras preguntas en las etiquetas