Роль контекста аля переменных скалярного и векторного типа — КиберПедия 

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...

Роль контекста аля переменных скалярного и векторного типа

2022-12-30 16
Роль контекста аля переменных скалярного и векторного типа 0.00 из 5.00 0 оценок
Заказать работу

Отметим, что оператор построения списка (,) выглядит точнотак же, как оператор (,) последовательного вычисления (sequentialevaluation). Какой из операторов используется, зависит от контекста, в котором он появляется, в частности, является ли переменная скаляром или массивом. Perl использует конструирование списков в контексте массивов и последовательное вычисление для скаляров. Рассмотрим следующие выражения:

@an_array = (1,2,3,4,5); $a_scalar = (1,2,3,4,5);

В первом выражении инициализируется массив, в то время каквторое выражение устанавливает значение скалярной переменной$a_scalar равным 5, отбрасывая первые четыре величины. Рассмотрим два следующих выражения:

print $assoc{1,2}; print @assoc{1,2};

В первом случае будет напечатано одно значение ассоциативного массива с двумя ключами, в то время как во втором будут напечатаны два значения ассоциативного массива с одним ключом. Издвух следующих выражений первое копирует список, тогда как второе присваивает скалярной величине значение, равное размеру массива:

@x = @list; $x = @list;

АССОЦИАТИВНЫЕ МАССИВЫ

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

$ages{'Bob'} = 35; $ages{'Mary'} = 25; $, = ' '; # change output separator for print operator print @ages{'Bob','Mary'}; # выведет '25 35' print keys(%ages);  # выведет 'Bob Mary' for $name (keys(%ages))  {      print "$name is $ages{$keys}\n";  }

Как можно видеть, программа присваивает значения переменной'$,' (скалярная переменная, именем которой является запятая).Скрипт использует это выражение для того, чтобы при дальнейшемиспользовании оператора print выходные данные не сливались междусобой. Далее в этой главе обсуждаются специальные переменные, такие как '$,'. Ассоциативные массивы идентифицируются с помощьюфигурных скобок. Так же как с массивами, при ссылках на ассоциативный массив целиком индексы не используются. Например, ссылка@ages{'Bob', 'Mary'} использует индексы в скобках, что указываетна ассоциативный массив. Префикс @ указывает на то, что речь идето массиве. Аналогичное использование знака доллара перед массивом указывает, что используется скалярная величина.

Примечаиие: Если два ключа заданы, то вместе со знаком @ эта говорит о том, что речь идет о части ассоциативного массива и результат должен быть в виде списка. Такое выражение эквивалентно#ages{' Bob'}, #ages{'Mary'}. которое имеет своим значением величину (35, 25).

Выражение print keys(%ages) вызывает оператор keys, которыйвозвращает полный список ключей ассоциативного массива. Ссылка %ages со знаком процента в качестве префикса означает, что ссылка относится ко всему ассоциативному массиву. Обратите внимание,что цикл for ссылается на переменные, заключенные в двойные кавычки. Наконец, последний из рассмотренных примеров также использует оператор keys и вводит цикл for для распечатки всех сочетаний ассоциативного массива. Цикл for ссылается на переменные,заключенные в двойные кавычки. Perl, в свою оче редь, заменитзначения, на которые ссылаются переменные, в то время, когда будет анализировать строку. Программисты называют этот процесс подстановкой переменной или интерполяцией.

Примечание: Perl не интерпретирует переменные, содержащие строкив одинарных кавычках.

ОПЕРАТОРЫ PERL

В то время как типы данных и переменных языка Perl значительно отличаются от соответствующих типов языка С, операторы ивыражения Per] должны вам показаться гораздо более знакомыми. Всеоператоры С присутствуют в языке Perl, за исключением операторыприведения типов (type), операторы обращения к содержимому указателя *ptr и оператора выбора члена структуры var.member илиvar->member. Кроме того, в языке Perl реализовано много новыхоператоров для использования в таких операциях как сравнение иобработка строк.

АРИФМЕТИЧЕСКИЕ ОПЕРАТОРЫ

Арифметические операторы действуют на числовые значения, иих результатом является число. Если выражение включает строковыеоперанды, то Perl конвертирует строковые значения в числовые перед тем, как оценить выражение. Perl выполняет преобразованиестрок в числа подобно тому, как это делает функция atof()языка Св библиотеки времени выполнения. В настоящее время Perl поддерживает следующие арифметические операторы:? + сложение? - вычитание или изменение знака? * умножение? / деление (только для чисел с плавающей запятой)? % взятие по модулю (только для целочисленных значений)

Рассмотрим примеры следующих арифметических операций языка Perl:

$x = 2.5; $y = 3;   print ($x + 2*$y);         # выведет 8.5 print (7 / $y);          # выведет 2.3333333 print int (7 / $y);        # выведет 2 print (7 % $y);          # выведет 1 print (7.5 % $y);         # выведет 1

Примечание: В языке Perl оператор деления всегда имеет результатом 4ucw с плавающей точкой, а результатом взятия одного числа помодулю другого является целое число и причем предварительно обаоперанда преобразуются к целому типу.

Рассмотрим следующую операцию взятия по модулю:

print (7.9 % 3.6);  # выведет 1 то же (7 % 3) = 1

Perl также поддерживает операторы инкремента и декремента:? ++ декремент в префиксной или постфиксной форме? - инкремент в префиксной или постфиксной формеРассмотрим примеры операций инкремента и декремента:

$x = 4; ++$x; print $x; # выведет 5 $y = $x-; # уменьшит x после присвоения y значения x print "$y $x" # выведет 5 4

Наконец, Perl обеспечивает арифметический оператор для возведения в степень (**). Рассмотрим следующие примеры использования операции возведения в степень:

$x = 2 ** 3; # результат 8 $x = 2 ** 0.5; # квадратный корень из 2 $x = -2 ** -3; # 1/(-2 в кубе), результат -1/8 (-0.125)

ПОБИТОВЫЕ ОПЕРАТОРЫ

Побитовые операторы воздействуют на бинарное представлениецелых чисел и имеют целочисленный результат. Если операндом является строка или дробное число, Perl предварительно преобразуетего в целое число, обрабатывает операнд, используя 32-битноепредставление. Все побитовые операторы С представлены в языкеPerl:? | побитовое ИЛИ? & побитовое И? ^ побитовое исключающее ИЛИ? ~ побитовая инверсия? << сдвиг влево? >> сдвиг вправо

Рассмотрим следующие примеры побитовых операций:

 $x = 5;          # 101 в двоичном $y = 3;           # 011 в двоичном print $x | $y;       # 7 (111) print $x & $y;       # 1 (001) print $x ^ $y       # 6 (110) print $x & ~1;      # 4 (100) print $x << 2       # 20 (10100) print $x >> 1       # 2 (10)

Так же как в С, поведение операторов сдвига вправо зависит отреализации язы ка в случае, если операнд является отрицательным.

ОПЕРАТОРЫ СРАВНЕНИЯ

Операторы сравнения сравнивают величины двух операндов. Также как при работе с арифметическими операторами, Perl преобразует строчные операнды в численные перед тем, как выполнять сравнение. Для того чтобы позволить скрипту сравнивать строки, которые не являются числами, Perl имеет дополнительные операторыстрокового сравнения. Эти операторы сравнивают строки, используявеличины ASCII. Если численное значение задано как операнд присравнении строк, оно сначала преобразуется в строку. Таблица 12.1перечисляет операторы сравнения:

Число Строка Значение = = eq  равно!=  nе  не равно >  gt  больше чем <  it  меньше чем >=  gе  больше или равно <=  lе  меньше или равно <=> cmp не равно (результат со знаком)

Табл. 12.1. Операторы сравнения языка PerlРезультатом операции сравнения является единица, если сравнение истинно и нуль в противном случае. Однако последняя операция (<=> или cmp) может возвращать значения -1, 0 или 1 в зависимости от того, является ли значение первого операнда меньше, чемвторого, равным ему или большим.

Примечание: Оператор cmp языка Perl ведет себя, аналогично функции Strcmp() библиотеки времени выполнения языка С.

Рассмотрим следующий пример сравнения:

$x = 5;          # x равно 5 print ($x < 4);   # если false, то выведет 0

ЛОГИЧЕСКИЕ ОПЕРАТОРЫ

Логические операторы анализируют булевы выражения и возвращают значения <истинно> или <ложно> в качестве результата. Perlобрабатывает операнды логических операций как булевы величины, т.е. как истинное или ложное значение.

Логические операторы языка Perl включают следующие:

? || логическое ИЛИ? && логическое И

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

?! логическое отрицание ()??: условная операция?, последовательное выполнение

Оператор логического отрицания (!) заменяет значение булевой величины на противоположную. Так же как и в С, в языке Perl условный оператор (?:) использует три операнда. Выражение, использующее условный оператор, имеет следующую форму:

 Condition? true-result: false-result

Аналогично, следующее выражение использует условный оператор длятого, чтобы предоставить Бобу полный доступ, а всем остальным ограниченный:

$access = ($user eq 'Bob'? 'Full': 'Limited');

Оператор последовательного выполнения <,> (также известный какоператор запятая) не является вполне логическим оператором, поскольку он не анализирует истинность своих операндов. Perl выполняет операнды оператора последовательного выполнения слева направо и возвращает значение самого правого операнда. Следующий пример иллюстрирует использование оператора запятая в цикле for.

For ($i=0, $j=10; $i<10; $i++, $j-)  {     print i$,' ',$j  }

СТРОКОВЫЕ ОПЕРАТОРЫ

Поскольку Perl представляет собой язык для обработки текста,неудивительно, что в него включены дополнительные операторы дляработы со строками. Ниже перечисляются операторы обработки строк:?. конкатенация строк? х репликация? =~ сопоставление переменной с образцом?!~ то же, что и предыдущее, но с дополненным отрицанием результата

Первые два оператора легко иллюстрируются примером:

print 'b'. 'an' x 2. 'a';  # выведет 'banana'

Как показано, это выражение использует конкатенацию строк иоператор репли-кации для того, чтобы напечатать строку <banana>.Два последних оператора используются для проверки того, включаетли строковый операнд заданный образец. Этот вопрос детально обсуждается в разделе <Регулярные выражения>. Следующий пример иллюстрирует их использование:

$var = 'banana'; print ($var =~ /ana/)? TRUE: FALSE;

В этом случае оператор проверки вхождения в строку образца(=~) использовался для проверки того, входит ли образец ana в переменную $var. В данном случае выражение принимает значение <истинно>.

ОПЕРАТОРЫ ПРИСВАИВАНИЯ

Если вы знакомы с языком программирования С, то формы операторов присваивания языка Perl должны быть для вас совершенно знакомыми. Так же как и в С, эти операторы заставляют Perl выполнить специальные операции со значениями, которые появились с правой стороны оператора, и затем выполнить присваивание:

= += -= *= /= %= |= &= ^= ~= <<= >>= **=.= x=

LVALUES В языке Perl, так же как и в С, lvalue представляет собойимя того, что стоит с левой стороны оператора присваивания. Таким образом, lvalue представляет собой целостность, которой может быть присвоено значение, например, lvalue может быть переменной. Например, скрипт Perl не может присвоить значение строкесимволов, наподобие выражения <Bob> = 32, поскольку <Bob> не является lvalue. Тем не менее, скрипт может присвоить значение переменной $Bob, например, следующим образом $Bob = 32, посколькупеременная $Bob является lvalue. В языке Perl любая целостность,которая может использоваться как lvalue, обычно таковой и является. Например, следующее выражение упаковывает (pack) и распаковывает (unpack) список значений, причем список переменных в первомслучае и три скалярных во втором являются lvalues:

  @color = ($r, $g, $b);   # пакет цветов  ($r, $g, $b) = @color;   # распаковка цвета

Когда вы работаете со списками в языке Perl, оператор присваивания не обяза тельно относится ко всему списку. Скрипт можетприсваивать значения отдельным элементам списка, как показано ниже:

  @items[2,4,7] = (100,200,300);

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

($arg1,$arg2,@rest) = @ARGV; # можно смешать скаляры и массивы

Поделиться с друзьями:

Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...

Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...

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

Индивидуальные и групповые автопоилки: для животных. Схемы и конструкции...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.021 с.