AppleScript для абсолютных новичков

Дата публикации:16.07.2012
Twitter Facebook Vkontakte

Глава 6. Списки

В предыдущих главах вы увидели как писать очень простые сценарии для выполнения основных вычислений и операций над строками. Пользователю сценария можно предоставить результат командой "display dialog" [1]. В этой и следующей главах мы будем использовать команду "display dialog" чтобы лучше изучить различные аспекты языка AppleScript.

display dialog "This sentence is what will be displayed in the dialog window."	[1]

Если выполнить сценарий [1], вы увидите диалоговое окно, которое по умолчанию имеет две кнопки: Cancel и OK.

Кнопка Cancel останавливает дальнейшее выполнение сценария. Так как вышеописанный сценарий не имеет каких-либо других операторов, кнопка Cancel здесь просто лишняя. Давайте изучим это поближе и определим кнопки диалогового окна сами. Команда "display dialog" позволяет задать список кнопок. В нашем случае, нам нужна лишь одна кнопка, которую мы хотим увидеть как "OK" [2.2].

set stringToBeDisplayed to "Julia is a pretty actress."	[2]
display dialog stringToBeDisplayed buttons {"OK"}

Если вы теперь запустите сценарий, то вы увидите, что кнопка Cancel исчезла.

Как показано во втором операторе [2.2], список содержит строку "OK", помещенную между фигурными скобками. Откуда здесь эти фигурные скобки? Как мы видели ранее, AppleScript'у нужны ключи, помогающие ему понять значение каждого элемента в операторе сценария. Чтобы помочь AppleScript распознать список (list), тоже необходим ключ, состоящий из фигурных скобок.

Список в операторе [2.2] содержит только один элемент, строку "OK". Если список содержит больше элементов, они разделяются запятыми [3] .

set exampleList to {213.1, 6, "Julia, the actress", 8.5} [3]

Список в операторе [3] содержит 4 элемента: одна строка и три числа. Давайте вернемся к команде "display dialog" и создадим диалоговое окно с несколькими кнопками. Команда AppleScript "display dialog" позволяет задать одну, две или три кнопки, с (уже совсем скоро) текстом на ваш собственный выбор. Так, для того чтобы создать диалоговое окно с тремя кнопками, мы определяем список с тремя элементами [4.2].

set stringToBeDisplayed to "Julia is a pretty actress."
display dialog stringToBeDisplayed buttons {"So, so", "Don't know", "Yes"}[4]

Вы заметили, что нет выделенных кнопок, когда вы их определяете сами [2.2, 4.2] Это значит, что человек, который запустит сценарий, не сможет нажать клавишу Enter, чтобы убрать диалоговое окно. Так как этот человек Мак-юзер, который ценит дружественность интерфейса, то мы теперь позаботимся о выделенной кнопке [5].

set stringToBeDisplayed to "Julia is a pretty actress."
display dialog stringToBeDisplayed buttons {"So, so", "Don't know", "Yes"} default button "Yes" [5]

Вместо написания имени кнопки выделяемой из всех, вы можете указать номер кнопки [6], т.е. третий элемент в данном списке.

set stringToBeDisplayed to "Julia is a pretty actress."
display dialog stringToBeDisplayed buttons {"So, so", "Don't know", "Yes"} default button 3 [6]

В следующей главе вы научитесь определять какая кнопка была нажата. А пока мы продолжим изучать списки. Списки могут быть использованы для хранения серий данных. Поэтому вам нужно будет знать как редактировать список и извлекать данные из списка. Самое простое - добавлять данные в начало или конец списка. Чтобы добавить элементы к списку мы используем амперсанд, подобно тому как было в строках.

set	addToBegin to {"winter"}
set	addToEnd to {"summer",  "autumn"} [7]
set	currentList to {"spring"}
set	modifiedList to addToBegin & currentList & addToEnd

В операторе [7.4] мы создали список состоящий из четырех элементов. Поле результата покажет фигурные скобки - характерная особенность типа данных "list" (список).

{"winter", "spring", "summer", "autumn"}

Обратите внимание, что "addToBegin" и "addToEnd" просто имена переменных [7.1-7.2], выбраны для того, чтобы помочь вам понять сценарий и они не делают ничего, кроме того что ссылаются на данные. Зеленый цвет точно указывает их принадлежность к именам переменных.

Вы можете обратится к каждому элементу (item) в списке по номеру. Самый левый элемент является элементом 1, следующий - 2 и т.д. Это позволяет вам получить соответствующее значение из списка, или изменить значение (такое как строка или число). Вот пример [8].

set myList to {"winter", "summer"}
set item 2 of myList to "spring"	[8]
get myList

Команда "get" в последнем операторе [8.3] позволяет нам показать значение переменной myList в поле результата. Это поле покажет значение переменной myList как {"winter", "spring"}.

Сфокусируйте внимание на втором операторе [8.2], такого же результата можно добиться любым из следующих двух операторов в сценарии [9], как у второго оператора в сценарии [8].

set the second item of myList to "spring"
set the 2nd item of myList to "spring"	[9]

Первый оператор [9.1] изящно демонстрирует англоязычную натуру AppleScript. Эта словесная нумерация работает до десятого элемента. После десятого, вы должны прибегнуть к "item 11", "item 12" и т.д. В качестве альтернативы, вы можете написать "11th item" и т.д. аналогично [9.2]. Кроме ссылки по словесно нумерованному списку элементов, есть также и "last" item (последний элемент) [10].

set myList to {"winter", "summer"}
set valueOfLastItem to the last item of myList	[10]

Так что, вам не надо помнить какой длины список, чтобы получить значение последнего элемента списка (или установить его на другое значение).

AppleScript позволяет вам обращаться к элементам, отсчитывая их в обратном направлении, т.е. справа налево. Чтобы отсчитывать с конца, используйте отрицательные числа, где -1 будет последним значением, значение -2 - предпоследним, и т.д. Сценарий [11] выдаст в точности такой же результат, что и сценарий [10].

set myList to {"winter", "summer"}
set valueOfLastItem to item -1 of myList	[11]

Теперь вы знаете, как создать список, как добавить элементов к нему и как изменить значения элементов списка. Вы также знаете как получать одиночное значение из списка. Вы, возможно, еще хотите узнать как создать список из части другого списка [12].

set myList to {"a", "b", "c", "d", "e", "f", "g", "h"}	[12]
set shortList to items 2 through 5 of myList

В операторе [12.2], вы можете использовать "thru" вместо "through". Если вы измените порядок номеров элементов [13.2] при указании диапазона, ваш список не будет перевернут [13].

set myList to {"a", "b", "c", "d", "e", "f", "g", "h"}	[13]
set shortList to items 5 through 2 of myList

Так что результат сценария [13] будет в точности такой же, что и у сценария [12].

Чтобы перевернуть порядок элементов в списке, в вашем распоряжении имеется команда "reverse" [14].

set reversedList to reverse of {3, 2, 1} [14]

Иногда вам надо будет знать какой длины ваш список. Ответ легко получить [15], используя один из двух следующих операторов.

set theListLength to the length of {"first",  "last"}
set theListLength to the count of {"first",  "last"}[15]

И наконец, вы можете обратиться к случайному элементу [16].

set x to some item of {"hearts", "clubs", "spades", "diamonds"} [16]

Я знаю, эта глава длинная, но мы действительно должны обсудить некоторые вопросы, имеющие место быть со строками и списками. Мы не обсуждали их в главе 5, где рассказывалось о строках, потому что мы не говорили еще о списках. Так что держитесь или сделайте сначала небольшой перерыв.

В предыдущих главах вы узнали, что возможно преобразовать один тип данных в другой. Сейчас мы покажем вам как превратить строку (или число) в список [17].

set cardType to "hearts"
set stringAsList to cardType as list [17]

После преобразования строки в список, в поле результата будет список содержащий один единственный элемент - строку {"hearts"}.

Когда приходится работать со списками и строками вместе, преобразование является важной мерой безопасности, как ниже будет показано.

Как вы помните, амперсанд использовался для объединения строк. Что случится если вы используете амперсанд для добавления строки к списку [18]?

set myList to {"a"}
set myString to "b"	[18]
set theResult to myList & myString

Тип данных переменной theResult зависит от типа данных, который встретится первым в вычисляемом выражении [18.3]. Так как выражение начинается с переменной myList, которое есть список, результат тоже будет списком. Попробуйте сделать это сами и проверить поле результата. Оно откроет вам тип данных результата, показав фигурные скобки. Если мы изменим порядок следования имен переменных myList и myString, и запишем [19.3]:

set myList to {"a"}
set myString to "b"	[19]
set theResult to myString & myList

то результатом будет строка. Этот вариант проходит, но при этом не говорится, что если вы не обратите особого внимания на такие изменения, то они легко приведут к ошибкам в вашем сценарии. Чтобы предотвратить появления чего-либо неожиданного, сделайте преобразование [20].

set myList to {"a"}
set myString to "b"	[20]
set theResult to (myString as list) & myList

В операторе [20.3], строка "b", содержащаяся в переменной myString, преобразуется в список {"b"}, независимо от типа данных содержащегося в "myString". Так как переменная "myString", теперь содержит список, theResult тоже будет списком [20.3].

Для того, чтобы добавить один или несколько элементов к списку, без конкатенации, вы можете написать:

set myList to {1, 2, 3, 4}
set the end of myList to 5
get myList

Так, поверьте, будет быстрее.

Кроме преобразования, превращающего строку в список, можно создать список, содержащий все символы строки [21]. (Примечание: хотя использование "item" вместо "character" будет работать, этого не рекомендуется делать под Mac OS X).

set itemized to every character of "Hi there."	[21]

Полученный список, видимый в поле результата, похож на:

<...>

Вместо того, чтобы разбивать фразу на одиночные символы, вы скорее захотите поделить предложение на слова. Это можно сделать используя AppleScript's text item delimiters (разделители элементов слов AppleScript'а. Вы указываете символ, который будет служить как разделитель элементов, которые в итоге составят список. Для того, чтобы разрезать предложение на слова, разделителем должен быть пробел. Посмотрите сценарий [22]. Хорошим тоном при написании сценариев считается следующее: если вы изменили AppleScript's text item delimiters [22.3], то измените их назад сразу после использования [22.5].

set	myString to "Hi there."
set	oldDelimiters to AppleScript's text item delimiters
set	AppleScript's text item delimiters to " "	[22]
set	myList to every text item of myString
set	AppleScript's text item delimiters to oldDelimiters
get	myList

Обратите особое внимание на оператор [22.4], где говорится "text item", а не просто "item". Это часто совершаемая ошибка. text item text item text item. Запомнили?

Легко преобразовать список в строку [23].

set myList to {"a",  "b",  "c",  "d",  "e",  "f",  "g",  "h"}	[23]
set myList to myList as string

Если вам нужно, чтобы в строке отдельный символ или серия символов разделяли исходные элементы списка, вы должны установить AppleScript's text item delimiters соответствующим образом [24].

set	myList to {"a", "b", "c", "d", "e", "f", "g", "h"}
set	oldDelimiters to AppleScript's text item delimiters
set	AppleScript's text item delimiters to " -/-"	[24]
set	myList to myList as string
set	AppleScript's text item delimiters to oldDelimiters
get	myList

Объединяем выученное в сценарии [22] и сценарии [24]. Теперь у вас есть возможность выполнять операции поиска и замены в тексте.

Причина, почему вы должны восстанавливать предыдущее значение AppleScript's text item delimiters, кроется в том, что другие авторы сценариев могут быть менее осторожны. Их сценарий может предполагать использование особого значения AppleScript's text item delimiters. Изменение, вносимое вашим сценарием, запоминается в AppleScript (компоненте MacOS X) даже после завершения вашего сценария.

Подведем итог: есть несколько типов данных, такие как число, строка и список. Каждый тип данных имеет свои собственные операторы, которые вы можете использовать для выполнения различных операций с вашими данными. Много разных операторов служит для манипуляций списками. В этой главе, посвященной спискам, мы так же узнали немного нового о строках.

Дополнительная информация

  1. Полный вариант книги (rtf/7z)-- электронная книга с сохранением иллюстраций, форматирования, изменений в цвете шрифта.


Распространение материалов сайта означает, что распространитель принял условия лицензионного соглашения.
Идея и реализация: © Владимир Довыденков и Анатолий Камынин,  2004-2019