Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 [ 33 ] 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242

При большом количестве многословных элеме]ггов создайте Bcrpoeimbni документ и последовательно извлекайте из пего строки:

(ЭИпез = (« END OF HERE DOC m/"\s.( +)/gm),

The boy stood on the burning deck,

It was as hot as glass END OF HERE DOC

Комментарий

Наиболее распространен первый способ - в основном из-за того, что в виде литералов в программе ипициализируются лишь небольпте массивы. Иппци-алнзация большого массива загро.мождает программу п усложняет ее чтение, поэтому такие массивы либо инпнпализируются в отдельном бнблпотечно.м фа]1ле (см. главу 12 «Пакеты, библиотеки и модули»), либо просто читаются из файла да]Н1Ых:

@bigarray = (),

open(DATA, < mydatafile ) or die Couldn t read from datafile $i\n , while (<DATA>) { chomp,

push(@bigarray, $ ),

Bo втором способе используется оператор qw. Наряду с q(), qq() и qx() он предназначен для оггределення строковых величин в программе. Оператор q() интерпретируется по правилам для апостро(}юв, поэтому следующие две строки эквивалентны:

$banner = The mines of Moria , Sbanner = q(The mines of Moria),

Оператор qq() интерпретируется no правилам для кавычек:

$name = Gandalf ,

Sbanner = Speak, Sname, and enter , Sbanner = qq(Speak, Sname, and welcome),

A оператор qx() интерпретируется почти так же, как и обратные апострофы, - то есть выполняет команду с интерполяцией переме]н£ых п слул<ебиыми символами \ че])ез командный интерпретатор. В обратшх апострофах интерполяцию отменить нельзя, а в qx - можно. Чтобы отказаться от расширения переменных Perl, используйте в qx ограничитель :

$his host = www perl com ,

Shost info = nslookup $his host , # Переменная Perl расширяется

$perl info = qx(ps $$), й Значение $$ от Perl

$shell info = qx ps $S, й Значение S$ от интерпретатора

Если операторы q(), qq() и qx() определяют одиночные строки, то qw() определяет список однословных строк. Строка-аргумент делится по пробелам без интерполяции неременных. Следующие строки эквивалентны:

©banner = (Costs, only , S4 95 ),



4.2. Вывод списков с запятыми 117

igibanner = qw(Costs only $4 95),

igibanner = split( Costs only $4 95):

Bo всех операторах определения строк, как и при поиске регулярных выражений, разрешается выбор символа-ограничителя, включая парные скобки. Допустимы все четыре типа скобок (угловые, квадратные, фигурные и круглые). Следовательно, вы можете без onaceiHiii использовать любые скобки при условии, что для открывающей скобки на11дется закрывающая:

isibrax = qwi ()<>{}[], brings = qw(Nenya Narya Vilya), Stags = qw<LI TABLE TR TD A IMG HI P>,

Ssample = qw(The vertical bar () looks and behaves like a pipe ),

Если ограничитель встречается в строке, а вы пе хотите заменить его другим, используйте пре(1и1кс \:

Igibanner = qwThe vertical bar (\) looks and behaves like a pipe ,

Оператор qw() подходит лишь для списков, в которых каждый .элемент является отдельным слово.м, ограниченным пробелами. Будьте осторожны, а то у Колумба вместо трех кораблей появится четыре:

Sships = qw(Nica Pinta Santa Магна), # HEBEPHQi i

Sships = (Nica, Pinta, Santa Магна), tt Правильно

[> Смотри также-

Раздел «List Value Constructors* perldata(l); раздел «Quote and Quote-Like Operators* perhp(i); оператор s / описан вperhp(l).

4.2. Вывод списков с запятыми

Проблема

Требуется вывести список с исизвсстпым количеством элементов. Элементы разделяются запятыми, а перед носледпп.м элементом выводится слово and.

Решение

Следующая функция возвращает строку, отформатированную требуемы.м образом:

sub commify series {

(@ == 0) • •

(@ == 1) $ [0]

((? == 2) "J join(" and ,(? )

join(", , isi [0 ($# -1], and S [-1]"),

Комментарий

При выводе содержимое массива порой выглядит довольно странно:

igiarray = (red", "yellow", green),



print "I have ", ©array, " marbles \n; print "I have §array marbles\n", I have redyellowgreen marbles. I have red yellow green marbles.

Ha самом деле вам нужна строка "1 have red, yellow, and green marbles". Приведенная выше функция генерирует строку именно в таком формате. Между двумя последними элементами списка вставляется "and". Если в списке больше двух элементов, все они ра.зделяются заптыми.

Пример 4.1 демонстрирует применение этой функции с одним дополнением: если хотя бы один элемент списка содержит запятую, в качестве разделителя используется точка с запятой.

Пример 4.1. commify series

#i/usr/bin/perl -w

tt commify series - демонстрирует вставку запятых при выводе списка

©lists = (

[ just one thing ],

[ qw(Mutt Jeff) ],

[ qw(Peter Paul Mary) ],

[ To our parents, Mother Theresa, God ],

[ pastrami, ham and cheese, peanut butter and jelly, tuna ], [ recycle tired, old phrases, ponder big, happy thoughts ], [ recycle tired, old phrases,

ponder big, happy thoughts,

sleep and dream peacefully ],

foreach $aref (©lists) {

print "The list IS . commify series(@$aref) . \n",

sub commify series {

my Ssepchar = grep(/,/ => @ ) "; (@ == 0) ? " :

(@ == 1) ? $ [0] :

((? == 2) ]oin(" and , @ )

]oin("$sepchar isi [0 ($# -1)], "and $ [-1]");

Результаты выглядят так:

The list is: just one thing.

The list is: Mutt and Jeff.

The list is: Peter, Paul, and Mary.

The list is: To our parents, Mother Theresa, and God.

The list is: pastrami, ham and cheese, peanut butter and jelly, and tuna.

The list is: recycle tired, old phrases and ponder big, happy thoughts.



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 [ 33 ] 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242