Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Особенности использования констант 
:(
    Опции темы
Danissimo
Дата 7.9.2006, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 14.8.2006
Где: Санкт-Петербург

Репутация: 1
Всего: 1



my %h = ('x' => '1');
print $h{'x'} . "\n";

работает правильно. Однако

use constant KEY => 'x';
my %h = ('x' => '1');
print $h{KEY} . "\n";

Use of uninitialized value in concatenation (.) or string at...

Почему?
PM MAIL   Вверх
ZeeLax
Дата 7.9.2006, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 4388
Регистрация: 20.8.2006
Где: Алма-Ата

Репутация: нет
Всего: 88



Дело в том, что константы в Perl не интерполируются как строковые переменные. Но они очень успешно конкатенируются. Так что можно схитрить следующим образом:
Код

#!/usr/bin/perl -w

use strict;
use constant KEY => 'x';

my %h = ('x' => '1');
print $h{''.KEY} . "\n";

Или же можно "представить" что константа - это список из одного элемента и просто написать так:
Код

#!/usr/bin/perl -w

use strict;
use constant KEY => 'x';

my %h = ('x' => '1');
print $h{(KEY)} . "\n";

или же (для надёжности smile )
Код

#!/usr/bin/perl -w

use strict;
use constant KEY => 'x';

my %h = ('x' => '1');
print $h{(KEY)[0]} . "\n";



--------------------
Utility is when you have one telephone, luxury is when you have two, opulence is when you have three — and paradise is when you have none.
— Doug Larson
PM MAIL WWW ICQ Skype Jabber   Вверх
korob2001
Дата 10.9.2006, 03:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



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

#!/usr/bin/perl -w
use strict;

use constant NAME     => "Вася";
use constant FAMILY   => "Пупкин";
use constant BIRTHDAY => "10.07.1984";

sub bye { return "Пока" };

print <<TEXT;
Привет!
Меня зовут @{[NAME]} @{[FAMILY]}.
Родился я @{[BIRTHDAY]}г., так что не забудьте поздравить. ;)
@{[bye]}.
TEXT

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

Меня зовут @{[NAME,FAMILY]}.

На первый взгляд может показаться, что необходимо вставить между ними ещё один елемент, с пробелом. Но делать этого не следует, так как наш массив интерполируется в строке, потому пробелы между елементами Perl вставит сам.

Это сообщение отредактировал(а) korob2001 - 10.9.2006, 03:51


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Danissimo
Дата 11.9.2006, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 14.8.2006
Где: Санкт-Петербург

Репутация: 1
Всего: 1



Да, грамотнее ответа и представить сложно.

ZeeLax, korob2001, спасибо. Большое.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1228 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.