Определение списка в программе
Проблема
Требуется включить в программу список — например, при инициализации массива.
Решение
Перечислите элементы, разделяя их запятыми:
@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а'); # Правильно
См. также
Proverte kod v komentariyah gde pro list tam oshibki detskie
Оставить комментарий:
|
|