Perl: Типы данных

Пару слов о типах.

Как и в любом языке (кроме, пожалуй, кодов процессора), в перл данные не просто свалены в кучу, а для удобного использования разбиты на типы. Люди, уже программировавшие на языках C\C++ или Pascal\Delphi сразу вспомнят про int(integer), char, string и будут не правы.

Для всего выше перечисленного в перл есть эквивалент — скаляр, он же — 1ый тип данных. По сути, скаляр — это «элемент», и не важно какого множества: чисел, символов, строк, ссылок… Главное, что он один! Для того, чтобы создать скаляр нам не нужно его как-то особенно объявлять, просто используем: $a=12; Значок $ даёт понять перлу, что это скаляр, а не что либо другое. Для примера, объявим несколько скаляров и проделаем с ними несколько стандартных операций (а ля if, while, for).

В догонку: комментарии в перл начинаются с символа #.

#!/usr/bin/perl
$a = 12345;
$b = 12345.67;
$c = .23E-10;
$hex = 0xffff;        # шестнадцатеричная запись
$oct = 0377;          # восьмеричная запись
$d = 1_234_567_890;   # то же самое, что и 1234567890
print $a.$b;          # Выведет "1234512345.67"
print '=' x 79, "\n"; # Выведет символ "=" 79 раз, после чего символ "\n" - перевод строки
$rub = "$a рублей\n";
print $rub;           # Выведет "12345 рублей", перевод строки
$a -= 12300;          # теперь $a равен 45ти
if($a){               # $a не 0 и не "0", и не "", и не undef, то есть - истина!
    print "Привет из 1ого if'а"
}
while($a){            # пока $a не станет равен 0 (в результате $a--)
    print --$a
}
print "привет из unless'а" unless $a; # unless - это if not.
# Сама конструкция может быть записана как unless($a){print "привет из unless'а"},
# но это не красиво :)

Что нового мы могли увидеть в этом коде? Для тех, кто ещё не знаком с конкатенацией(сложением строк) мог быть непонятен оператор . (точка). Он складывает строки(склеивает), оператор умножение строки на число, думаю, так же мог создать несколько вопросов. Оператор «x» берёт слева строку и повторяет её указанное справа число раз. Как можно уже было заметить, все операции в перл заканчиваются точкой с запятой. Однако, точка с запятой необязательна в некоторых случаях:

  1. Если операция последняя в блоке(блок — всё то, что стоит между «{» и «}»)
  2. Если операция последняя в файле

Так же можно было заметить, что 1ый комментарий нам ничего не объяснял… Задачей его было объяснить операционной системе через что запускать данный файл. В данном случае мы запускаем через исполняемый файл, находящийся по адресу /usr/bin/perl. Эту строчку можно и не писать, но тогда запускать файл придётся из консоли с прямым указанием на программу, которая будет интерпретировать наш код, то есть так:

Unix-way:

~$ perl example1.pl

в случае, если наш код сохранён в файл ~/example1.pl или же, при наличии первого комментария можно запускать так:

~$ ./example1.pl

или даже 2мя кликами по файлу(в графической оболочке), но для данного кода смысла в этом мало — всё выполнится и сразу исчезнет.

В Windows всё сделано через одно место, а именно через расширение файла (.pl), поэтому можно опять же дважды кликнуть или же пойти в консоль и набрать там

> perl example1.pl

или даже

> example1.pl

и увидеть работу нашего первого скрипта.

Кстати, если вы ещё не заметили, в переменную $a мы клали число, а пользовались при конкатенации уже строкой. Во время if’a $a вообще становилась логическим значением… И это всё «бесплатно» — без всяческих конвертов и явных преобразований типов. Перл сам знал что нам надо и тихо, мирно конвертировал переменную в тот тип, который нам нужен в данный момент. Вот такой вот умный зверь! :)

Но для того, чтобы он нас понимал, мы должны так же понимать и его: к примеру, когда мы преобразовываем скаляр в логическое выражение, мы должны понимать, что всё правда(истина), кроме пустой строки, нуля, строки «0″ и специального значения undef — не определён. Создать скаляр, значения undef проще простого: undef $a или $a = undef.


Ok. Теперь у нас есть возможность пользоваться переменными — элементами, но если нам надо использовать множество таких… Иначе говоря массив элементов. Для этих целей в перл есть тип данных «массив». Его опять же никак не надо описывать… просто используй! @a = (0,1,2,3,4); опять же символ @ здесь непросто для красоты, а указывает на то, что это массив! В данном примере мы присвоили первым 5ти элементам массива цифры от 0 до 4. И опять несколько примеров:

#!/usr/bin/perl
@a = 0..9; # забили первые 10 элементов массива цифрами от 0 до 9
print $a[2]; # напечатали 2ой элемент массива. Почему здесь $ а не @?
# всё логично: используем мы не массив, а элемент, пусть даже массива...
print @a[2..6]; # а вот здесь как раз @, потому как и печатаем мы не элемент,
# а подмассив (кусок массива, слайс) со 2ого по 6ой элемент
print for @a; # Ещё один классный пример того, как перл понимает на с полу слова :)
# если для кого не очевидно, что здесь происходит - объясняю:
# для каждого элемента массива @a напечатать его.
while(@a){ # пока массив не пуст
    print pop @a # напечатать то, что выпихнул pop из конца массива
} # так как pop уменьшает массив, то и из цикла мы выйдем

3ий и последний тип данных — хеш(hash), произносится как «хэш». Так же его можно назвать ассоциативным массивом. Мы его пока можем представлять, как некий массив, где элемент мы получаем не по числу — номеру элемента, а по строке — ключу хеша.

Объявляется хеш так: %h = (color => ‘red’, width => ’10px’, height => ’100px’); процент указывает на то, что это хеш. В него мы передаём массив из 6ти элементов, каждый чётный воспринимается как значение, а нечётный — как ключ. То есть по ключу color мы получим значение red. Может показаться странной конструкция color => ‘red’. Мы могли это так же записать как «color»,’red’. Правда у => есть ещё пара козырей: он сначала выполнит то, что слева(если это команда), после этого заменит все переменные их значениями, как это делают двойные кавычки. К слову:
print '@a'; # выведет "@a"
print "@a"; # выведет содержимое массива @a

Пара примеров с хешами:

#!/usr/bin/perl
%h = (
    color => 'red',
    width => '10px',
    height => '100px'
);
print $h{'color'}; # и опять скаляр, только скобочки уже
# не квадратные(как у обычного массива), а фигурные
print "\n$_ => ",$h{$_} for keys %h;
# Для неподготовленного человека это может показаться просто кракозяброй,
# Но мы уже кое-что знаем и можем понять смысл этой команды за исключением 2х моментов.
# 1. keys - функция, возвращающая массив ключей поданного на вход хеша
# 2. скаляр $_ - это переменная "по умолчанию". Проще говоря, это то, о чём сейчас речь,
# в данном случае речь идёт об элементе массива ключей(на каждом шаге цикла о разном).
# $_ - первая специальная переменная из множества, заложенных в перл.

К следующему шагу: Простые примеры.

Мне понравилась эта заметка:
Другое:
  • листогиб ручной
  • Цена билета на поезд здесь еще больше.
Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>