Определение списка в программе

Проблема

Требуется включить в программу список — например, при инициализации массива.

Решение

Перечислите элементы, разделяя их запятыми:
@a = ("quick", "brown", "fox");
При большом количестве однословных элементов воспользуйтесь оператором qw():
@а = qw(Why are you teasing me?);
При большом количестве многословных элементов создайте встроенный документ и последовательно извлекайте из него строки:
@lines = (<<"END_OF_HERE_DOC" =~ m/^\s*(.+)/gm);
The boy stood on the burning deck,
It was as hot as glass.
END_OF_HERE_DOC

Комментарий

Наиболее распространен первый способ — в основном из-за того, что в виде литералов в программе инициализируются лишь небольшие массивы. Инициализация большого массива загромождает программу и усложняет ее чтение, поэтому такие массивы либо инициализируются в отдельном библиотечном файле, либо просто читаются из файла данных:
@bigarray = ();
open(DATA, "< mydatafile") or die "Couldn't read from datafile: $!\n";
while (<DATA>) {
  chomp;
  push((@bigarray, $_);
}
Во втором способе используется оператор qw. Наряду с q(), qq() и qx() он предназначен для определения строковых величин в программе. Оператор q() интерпретируется по правилам для апострофов, поэтому следующие две строки эквивалентны:
$banner = 'The mines of Moria';
$banner = q(The mines of Moria);
Оператор qq() интерпретируется по правилам для кавычек:
$name   = "Gandalf";
Sbanner = "Speak, $name, and enter!";
$banner = qq(Speak, $name, and welcome!);
А оператор qx() интерпретируется почти так же, как и обратные апострофы, — то есть выполняет команду с интерполяцией переменных и служебными символами \ через командный интерпретатор. В обратных апострофах интерполяцию отменить нельзя, а в qx — можно. Чтобы отказаться от.расширения переменных Perl, используйте в qx ограничитель ':
$his_host   = 'www.perl.com';
$host_info  = 'nslookup $his_host';       # Переменная Perl расширяется
$perl_info  = qx(ps $$);                  # Значение $$ от Perl
$shell_info = qx'ps $$';                  # Значение $$ от интерпретатора
Если операторы q(), qq() и qx() определяют одиночные строки, то qw() определяет список однословных строк. Строка-аргумент делится по пробелам без интерполяции переменных. Следующие строки эквивалентны:
@banner = ('Costs', 'only', '$4.95');
@banner = qw(Costs only $4.95);
@banner = split(' ', 'Costs only $4.95');
Во всех операторах определения строк, как и при поиске регулярных выражений, разрешается выбор символа-ограничителя, включая парные скобки. Допустимы все четыре типа скобок (угловые, квадратные, фигурные и круглые). Следовательно, вы можете без опасений использовать любые скобки при условии, что для открывающей скобки найдется закрывающая:
@brax   = qw! ( )< >{ }[ ]!;
@rings  = qw(Nenya Narya Vilya);
$tags   = qw<LI TABLE TR TD A IMG H1 P>;
$sample = qw(The vertical bar (|) looks and behaves like a pipe.);
Если ограничитель встречается в строке, а вы не хотите заменить его другим, используйте префикс \:
@banner = qw|The vertical bar (\|) looks and behaves like a pipe.|;
Оператор qw() подходит лишь для списков, в которых каждый элемент является отдельным словом, ограниченным пробелами. Будьте осторожны, а то у Колумба вместо трех кораблей появится четыре:
$ships = qw(Nica Pinta Santa Маriа);         # НЕВЕРНО!!!
$ships = ('Nica', 'Pinta', 'Santa Маriа');   # Правильно

См. также




2013-09-10 17:05:19

Proverte kod v komentariyah gde pro list tam oshibki detskie




Оставить комментарий:
Ваше Имя:
Email:
Антибот: *  
Ваш комментарий: