8.2. Тип "дата"
В связи с тем, что на компьютере стала обрабатываться коммерческая информация, в обиход вошли такие типы данных, как "дата" и "время". Эти типы данных напрямую связаны с "системными часами" BIOS и операционной системы. В этих часах каждая секунда, прошедшая с 01.01.1980 или 01.01.2000 (в зависимости от срока изготовления компьютера), кодируется целым числом. О переводе этих чисел в "удобочитаемый" формат, о форматах хранения дат, времени, о представлении дат в программах вы можете узнать, прочитав этот раздел.
8.2.1. Формат представления дат в операционных системах
Форматы для выдачи данных типов "дата" и "время" хранятся:
- В операционной системе MS-DOS - в файле COUNTRY.SYS, загружаемом операционной системой по директиве в файле: CONFIG.SYS;
- В Windows - на панели "Пуск" -> "Панель управления" -> "Язык и региональные стандарты";
- В Linux - на панели: "Дата и время" одной из программ - "центров управления" компьютером;
При этом настройка форматов в Windows и Linux гораздо более "гибкая", чем в MS-DOS. В MS-DOS можно лишь задать "страну", а все остальные параметры выполняются по-умолчанию для этой страны. В Windows и Linux можно также задать "нестандартные" разделители цифр даты или времени.
Вообще-то форматы отображения даты отличаются:
- разделителем даты: (".", "/" или "-");
- порядком расположения числа, месяца и года, например:
- 05/31/2008 - для Северной Америки;
- 2008/05/31 - для Японии;
- 31/05/2008 - для остального мира, прежде всего - Европы.
Примечание. Во всех примерах закодирована дата: тридцать первое мая две тысячи восьмого года.
8.2.2. Пересчет дат в "удобочитаемый" формат
Чаще всего в прикладных программах используются следующие представления дат:
- Началом отсчета дат считается первое января 1900 года;
- Дата и время хранятся в одной ячейке памяти, имеющей формат long double или double;
- Дни представляются целой частью от значения с плавающей точкой (см. выше), а часы, минуты и секунды - ее дробной частью;
- В систему встроены функции для перевода дней и их дробной части в привычный формат:
<год><месяц><день><час><минуты><секунды>
Листинг
8.11.
- В системе предусмотрены функции для расчета дня недели и смещения времени относительно Гринвичского меридиана.
При этом возможны следующие формы пересчета:
- представление данных в виде строки символов, представляющих дату (обычно на английском языке);
- представление данных в виде массива или структуры, состоящие из целых чисел, представляющих составляющие даты.
О функциях для работы с датой и временем в различных языках см. в следующем подразделе 8.2.3.
8.2.3. Функции работы с датой. Perl
Функции работы с датой и временем на языке Perl представлены в таблице 8.4.
8.3. Резюме
Итак, мы познакомились с основными типами данных, которые могут понадобиться при написании программ, полезных "пишущему" человеку. Говорилось о "машинных" и "пользовательских" типах данных, о стандартных операциях с данными и об их приоритетах, о целочисленной арифметике, арифметике чисел с плавающей точкой и т.п. Вполне возможно, что Вы никогда не будете писать или отлаживать программы, использующие все возможности "машинных" типов данных или переопределять пользовательские типы данных. Но Вы должны иметь представление о данных, используемых в программировании, хотя бы для того, чтобы Вам "не вешали лапшу на уши" незадачливые программисты при написании технического задания, чтобы Вы могли грамотно выбрать язык, подходящих именно для Ваших задач. Эти знания бесценны на начальном этапе работы над проектом.
Ниже приводится сводка по языкам программирования и их применению.
- Perl - для обработки символьных данных, администрирования в операционных системах ЭВМ и в Интернете;
-
Python - для обработки символьных данных, в Интернете. Этот язык - интерпретатор максимально приближен к C++, и авторами позиционируется как замена языка Java;
- Quick Basic - простой язык для начинающих, позволяет осуществлять как символьные, так и числовые вычисления. Обладает очень слабыми возможностями в написании графического интерфейса;
- Си - профессиональный язык для системного программирования. Для реализации на нем символьных и числовых вычислений требуются дополнительные библиотеки;
- C++ - это "Си с классами", имеет все достоинства и недостатки языка Си, но реализация классов намного упрощает программирование на нем;
- Java - это язык для "программирования вообще" и, в частности, для программирования Ява аплетов в Интернете. Скомпилированный на нем код является кроссплатформенным кодом;
-
VBScript, javascript и т.д. - языки, используемые для манипуляции данными внутри страничек Интернета. Имеют сокращенные возможности в определении типов данных, операций ввода-вывода и других операциях, влияющих на безопасность в Интернете;
- Макроязыки текстовых редакторов (таких как memac или VBA) - позволяют "механизировать" и "оптимизировать" процесс редактирования текста в редакторе. Они обрабатывают только текстовые данные, а их типы "привязаны" к реализации соответствующего редактора.
8.4. Глоссарий
Термин |
Английский термин |
Разъяснение |
скаляр 1. |
scalar 1. |
(в Perl) Последовательность из одного или нескольких символов, значение (тип) которых определяется контекстом. Обозначается как: $<идентификатор>. |
одиночный символ |
Single character |
Символ в одной из кодировок, представленный одиночным целым числом без знака, расположенный в регистре или ячейке памяти. Этим он отличается от типов данных "строка", содержащих только один символ (поскольку любой строковый тип данных использует массив символьных данных в той или иной организации). |
контекст |
context |
Внешнее окружение и значение переменной, определяющее "тип данных" и результат операций. Контекст есть во всех языках, но наиболее "сильно" он реализован в Perl. |
массив скаляров |
array of scalars |
(в Perl) Специфический тип переменных, содержащий в себе несколько упорядоченных строковых значений. Обозначается как: @<идентификатор>. |
ассоциативный массив (хэш массив) |
hash array |
(в Perl) Массив парных символьных данных: "ключа" и "значения ключа". Обозначается как: %<идентификатор>. Хэш массивы широко используются в Интернете. |
апостроф |
apostrophe |
Знак препинания в английском языке, представляющий собой закрывающую одинарную кавычку, расположенную сверху. |
метасимвол |
metacharacter |
В Си-подобных языках - символ специального назначения, образованный путем добавления к алфавитно-цифровому символу знак "обратная косая черта" ("backslash"). Пример - символ "горизонтальная табуляция": "\t". |
ключ |
key |
(в Perl) Первая из парных строк символов ассоциативного массива, по которому ищется элемент с нужным значением. В хэш массиве значение ключа должно быть уникальным. |
значение (ключа) |
value (of a key) |
(в Perl) Вторая из парных строк символов ассоциативного массива, являющееся его символьным значением в общем понимании этого термина. В отличие от ключа, строка: "значение" может повторяться в ассоциативном массиве и даже может отсутствовать. |
тип дата |
date type |
Тип для представления даты и времени в компьютерах. При этом сами даты хранятся как числа с плавающей точкой двойной точности, а при выводе дата и время преобразуется в символьную константу. Этот тип данных появился с начала коммерческого использования компьютеров. |
тип время |
time type |
См. тип дата. |
системные часы BIOS |
BIOS reference clock |
Микросхема в ЭВМ, генерирующая и запоминающая количество импульсов периодичностью в одну секунду. При этом в BIOS записывается количество секунд, прошедших с 01.01.2000 г. в виде целого числа. Это значение потом могут считывать системные и прикладные программы. Питание на эту микросхему производится со специального элемента питания, расположенного на материнской плате. |
8.5. Приложение
Таблица
8.2.
Функции работы со скалярами в Perl
Функция |
Синтаксис |
Описание |
chomp |
chomp СПИСОК chomp
|
Удаляет из каждого строкового элемента замыкающий символ завершения записи, определенного значением переменной $/ (по умолчанию - \n). Возвращает общее количество удаленных символов. Список может состоять из одной переменной. При использовании без параметра функция эквивалентна chomp $_ . |
chop |
chop СПИСОК chop
|
Удаляет из каждого строкового элемента списка последний символ. Возвращаемое значение - удаленный символ из последнего элемента списка. Список может состоять из одной переменной. При использовании без параметров эквивалентно вызову chop $_ . |
chr |
chr ЧИСЛО chr
|
Возвращает символ по заданному числовому коду таблицы символов. При использовании без параметров эквивалентно вызову chr $_ . |
crypt |
crypt ТЕКСТ, ШИФР |
Шифрует ТЕКСТ с использованием заданного параметра шифра. Обратной функции дешифровки не существует. |
hex |
hex ВЫРАЖЕНИЕ hex
|
Интерпретирует строковое ВЫРАЖЕНИЕ как шестнадцатеричное число и вычисляет его десятичный эквивалент. При использовании без параметров вызов аналогичен вызову hex $_ . |
index |
index СТРОКА, ПОДСТРОКА[, ПОЗИЦИЯ] |
Возвращает позицию первого вхождения указанной подстроки в заданную параметром СТРОКА строку или "-1", если подстрока не найдена. Если задан параметр ПОЗИЦИЯ, то поиск начинается с заданной позиции в строке (нумерация символов в строке начинается с "0"). |
lc |
lc ВЫРАЖЕНИЕ, lc
|
Функция преобразует все прописные буквы строкового параметра ВЫРАЖЕНИЕ в строчные буквы и возвращает полученную строку. В случае применения use local при преобразовании используются текущие локальные установки. При использовании без параметров функция аналогична вызову lc $_ . |
lcfirst |
lcfirst ВЫРАЖЕНИЕ lcfirst
|
Преобразует первый символ строкового параметра ВЫРАЖЕНИЕ в нижний регистр и возвращает полученную строку. В случае применения use local при преобразовании используются текущие локальные установки. При использовании без параметров вызов функции аналогичен вызову lcfirst $_ . |
length |
length ВЫРАЖЕНИЕ length
|
Возвращает количество байтов в строке, являющегося значением параметра ВЫРАЖЕНИЕ. При использовании без параметров функция эквивалентна вызову length $_ . |
oct |
oct ВЫРАЖЕНИЕ oct
|
Интерпретирует строковое ВЫРАЖЕНИЕ как восьмеричное число и вычисляет его десятичный эквивалент. Если строка начинается с символов 0x, то его содержимое интерпретируется как шестнадцатеричное число. При использовании без параметров вызов функции аналогичен вызову oct $_ . |
ord |
ord ВЫРАЖЕНИЕ ord
|
Возвращает числовой ASCII код первого символа строки, являющегося значением параметра ВЫРАЖЕНИЕ. При использовании без параметров вызов функции аналогичен вызову ord $_ . |
pack |
pack ШАБЛОН, СПИСОК |
Упаковывает массив или список значений в двоичную структуру в соответствии с заданным шаблоном, представляющим собой последовательность символов, которые задают порядок и тип значений. Возвращает строку, содержащую полученную структуру. |
reverse |
reverse СПИСОК |
В списковом контексте возвращает список значений, состоящий из элементов, заданным параметром СПИСОК списка, но в обратном порядке, начиная с последнего символа. В скалярном контексте соединяет все элементы списка в одну строку, состоящую из символов полученной строки, но в обратном порядке. |
rindex |
rindex СТРОКА, ПОДСТРОКА[, ПОЗИЦИЯ] |
Возвращает позицию последнего вхождения указанной подстроки в заданную параметром СТРОКА строку или "-1", если подстрока не найдена. Если задан параметр ПОЗИЦИЯ, то поиск начинается до заданной позиции в строке (включая символ в этой позиции). |
sprintf |
sprintf ФОРМАТ, СПИСОК |
Возвращает строку, представляющую собой форматный вывод списка значений, определенного параметром СПИСОК, в соответствии с заданной параметром ФОРМАТ строкой формата. Символы форматирования соответствуют функции форматирования языка Си printf. |
substr |
substr СТРОКА, СМЕЩЕНИЕ[, ДЛИНА[, ЗАМЕЩЕНИЕ]] |
Находит и возвращает из параметра СТРОКА, подстроку длиной, равной значению параметра ДЛИНА, начиная с символа, заданного параметром СМЕЩЕНИЕ. Если значение СМЕЩЕНИЕ отрицательно, то извлечение начинается с последнего символа строки. Если значение ДЛИНА отрицательно, то от конца строки отсекаются количество символов, равное абсолютному значению этого параметра. Если задан строковый параметр ЗАМЕЩЕНИЕ, то найденная подстрока замещается ею в параметре СТРОКА, который в этом случае должен быть l-Значением. |
uc |
uc ВЫРАЖЕНИЕ, uc
|
Функция преобразует все строчные буквы строкового параметра ВЫРАЖЕНИЕ в прописные буквы и возвращает полученную строку. В случае применения use local при преобразовании используются текущие локальные установки. При использовании без параметров вызов функции аналогичен вызову uc $_ . |
ucfirst |
ucfirst ВЫРАЖЕНИЕ ucfirst
|
Преобразует первый символ строкового параметра ВЫРАЖЕНИЕ в верхний регистр и возвращает полученную строку. В случае применения use local при преобразовании используются текущие локальные установки. При использовании без параметров вызов функции аналогичен вызову ucfirst $_ . |
pos |
pos СТРОКА pos
|
Возвращает значение указателя позиции в строке после последней выполненной для нее операции поиска по образцу: m//g. Если используется в левой части операции присвоения, то изменяет значение указателя, влияя на \G в регулярном выражении. При использовании без параметров данный вызов эквивалентен вызову: pos $_. |
quotemeta |
quotemeta ВЫРАЖЕНИЕ quotemeta
|
Возвращает строку, в которой перед каждым неалфавитно-цифровым символом поставлена обратная черта. Значение параметра: ВЫРАЖЕНИЕ - интерпретируется как строка. (Внутренняя функция реализации управляющего символа \0 в строках в двойных кавычках). При использовании функции без параметров эквивалентно вызову quotemeta $_. |
split |
split /ОБРАЗЕЦ/[.ВЫРАЖЕНИЕ[.ПРЕДЕЛ]] split
|
Разбивает строку, являющуюся значением параметра: ВЫРАЖЕНИЕ, на массив строк, с использованием разделителя, определяемым регулярным выражением в параметре: ОБРАЗЕЦ. В списковом контексте возвращает полученный массив, в скалярном контексте - количество найденных строк разбиения. Если задан параметр: ПРЕДЕЛ, разбивает на не более чем заданное этим параметром число строк. Если параметр: ВЫРАЖЕНИЕ - не задан, то используется внутренняя специальная переменная интерпретатора Perl $_, Если не задан образец, то разбивает по пробельным символам. При использовании без параметра эквивалентна split /\s+/. $_. Операция split - антагонист операции: join. |
study |
study ВЫРАЖЕНИЕ study
|
Оптимизирует строковые данные параметра: ВЫРАЖЕНИЕ - для дальнейшего использования в повторных операциях поиска по образцу. В цикле с несколькими операциями поиска может сэкономить время выполнения. При использовании без параметров функция эквивалентна: study $_. |
Таблица
8.3.
Функции работы с массивами скаляров в Perl.
Функция |
Синтаксис |
Описание |
delete |
delete ВЫРАЖЕНИЕ |
Удаляет из массива скаляров его элемент или фрагмент, заданный параметром: ВЫРАЖЕНИЕ. Если удаляется последний элемент массива, то автоматически изменяется длина массива, если удаляются элементы из его середины, то оставшиеся элементы не сдвигаются (для сдвига используйте функцию splice()), а соответствующий "удаленный" элемент принимает неопределенное значение. В списковом контексте возвращает список удаленных элементов, а в скалярном - их количество. Если удаляемых символов в массиве нет, то возвращает неопределенное значение. Функция delete работает с массивами скаляров только в Perl версий 5.6.0 и выше. |
exists |
exists ВЫРАЖЕНИЕ |
Проверяет, был ли когда-либо инициализирован в массиве скаляров элемент, заданный параметром: ВЫРАЖЕНИЕБ, например, $array[3], даже если сейчас его значение не определено. Если да, то возвращает значение "истина", иначе - "ложь". Функция exist работает с массивами скаляров только в Perl версий 5.6.0 и выше. |
pop |
pop МАССИВ pop
|
Удаляет из массива скаляров последний элемент и возвращает его значение. Если массив пустой, то возвращает неопределенное значение undef. Если функция вызывается без параметров, то главной программе вызов эквивалентен pop @ARGV, а в подпрограмме pop @_. |
push |
push МАССИВ, СПИСОК |
Рассматривает массив скаляров, заданный параметром: МАССИВ, как стек и добавляет после его последнего элемента элементы списка, заданные параметром: СПИСОК. Возвращает количество элементов полученного массива. |
shift |
shift МАССИВ shift
|
Удаляет из массива скаляров первый элемент и возвращает его значение. После удаления элементы оставшиеся элементы сдвигаются влево: второй элемент становится первым, третий - вторым и т.д. Если массив пустой, то возвращает неопределенное значение undef. Если функция вызывается без параметров, то главной программе вызов эквивалентен shift @ARGV, а в подпрограмме shift @_. |
splice |
splice МАССИВ, НОМЕР[, КОЛИЧЕСТВО[, СПИСОК]] |
Удаляет из массива количество элементов, заданное значением параметра: КОЛИЧЕСТВО, начиная с элемента, заданное значением параметра: НОМЕР. В случае задания параметра СПИСОК заменяет указанные в нем элементы списка. В списковом контексте возвращает удаленные элементы; в скалярном контексте - последний удаленный элемент. Если параметр:КОЛИЧЕСТВО не задан, то удаляются все элементы после элемента с номером, определенным значением параметра: НОМЕР. |
unshift |
unshift МАССИВ, СПИСОК |
Добавляет элементы списка, определенного параметром: СПИСОК, в начало массива, заданного параметром МАССИВ. Выполняет действия, противоположные действиям функции shift. |
grep |
grep БЛОК СПИСОК grep ВЫРАЖЕНИЕ, СПИСОК
|
|
join |
join ВЫРАЖЕНИЕ, СПИСОК |
Рассматривает все элементы списка, определенного параметром: СПИСОК, как строковые значения, соединяет их в одну строку, вставляя между ними разделитель, равный значению параметра: ВЫРАЖЕНИЕ, и возвращает полученную строку. |
map |
map БЛОК СПИСОК map ВЫРАЖЕНИЕ, СПИСОК
|
|
pack |
pack ВЫРАЖЕНИЕ, СПИСОК |
|
reverse |
reverse СПИСОК |
В списковом контексте возвращает список значений элементов, заданный параметром: СПИСОК, в обратном порядке, начиная с последнего элемента. В скалярном контексте соединяет все элементы в одну строку и возвращает строку, в которой символы расположены в обратном порядке, начиная с последнего символа. |
sort |
sort [ПОДПРОГРАММА] СПИСОК sort [БЛОК] СПИСОК
|
Сортирует список значений, заданный в параметре: СПИСОК. Если параметры БЛОК и ПОДПРОГРАММА не заданы, то используется стандартная процедура сравнения строковых данных. Если они заданы, то операторы блока или подпрограммы используются в качестве процедуры сравнения при сортировке элементов списка. В этом случае в теле блока или подпрограммы в последнем операторе следует использовать операцию <=> или cmp в зависимости от сортировки соответственно числовых и строковых данных. Возвращает список, элементами которого являются отсортированные элементы исходного списка. |
unpack |
unpack ШАБЛОН, ВЫРАЖЕНИЕ |
|
Таблица
8.4.
Функции работы с датой и временем в Perl.
Функция |
Синтаксис |
Описание |
gmtime |
($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = gmtime( time ); |
Преобразует значение даты и времени в 9-ти элементный массив, соответствующий временной зоне Гринвича. Все элементы - числа. Месяц $mon принимает целые значения от 0 до 11, дни недели ($wday) - от 0 до 6, причем 0 - воскресенье, год ($year) отсчитывается от 1900 года. В скалярном контексте выдает такую же структуру данных, как и функция ctime(3). |
localtime |
($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime( time ); |
Полностью соответствует функции: gmtime, за исключением того, что значение относится к зоне местного времени. |
time |
time |
Возвращает число секунд, прошедшее с начала эпохи - 01 января 1970 года. |