LINUX.ORG.RU

пакетное объявление переменных в perl


0

0

есть перловая программа с двумя десятками переменных вида time01, time02, time03, etc...

вот такой вот вопрос: можно их как-то пакетно объявить?

фором например.

пытаюсь сделать вот так:

for (my $i=1; $i<=17; $i++) {
my "time$i";
}

не проходит, ругается на синтаксическую ошибку, и в принципе я его понимаю :)

что посоветуете?

★★★★

Если вы используете такие имена переменных, значит вам необходимо подумать - а всё ли вы делаете правильно?
Использование массива или хэша значительно логичнее.

Если нужны именно скаляры, тогда так:
[-- CUT --]
foreach (1..17) {
    ${*{'main::temp'.$_}{SCALAR}} = $_*2;
}
[-- CUT --]

warnings и strict придётся отключать.

nblx
()

Сорри за вопрос, но всё же: а зачем? То есть чем массив не устраивает?

Вообще мне тут сходу это не удалось сделать, но интуиция мне подсказывает, что это в принципе реально. Только my должно быть вне блока, надо что-то типа my ... foreach

Teak ★★★★★
()
Ответ на: комментарий от Teak

> Вообще мне тут сходу это не удалось сделать, но интуиция мне подсказывает

См. выше. Делается достаточно просто. Меняйте main на ваш модуль и temp - на нужное начало имени переменной. Это аналог команды my, но не проходит проверку в strict. Если постараться - можно сделать чтобы проходил. Но мне лень :-)

nblx
()

> что посоветуете?

воспользоваться для этого дела текстовым редактором.

и быстрее выйдет и проблем меньше

anonymous
()
Ответ на: комментарий от nblx

вообще да, думаю это через массив реализовать, вернее, через хэш (там подстановка номеров именами идет).

gr_buza ★★★★
() автор топика

массив, и потом определяй тип при помощи ref, c ним и работай. ваще для того, что ты делаешь, существует eval, но генерировать код проги во время её интерпретации имхо плохой стиль.

vilfred ☆☆
()
Ответ на: комментарий от vilfred

eval кстати никак не спасает, надо хитрее извращаться. Переменные, объявленные внутри eval, снаружи не видны.

Teak ★★★★★
()
Ответ на: комментарий от Teak

тогда яб в массив загонял, а после того как он не нужен писал ченнить вида $#arr=-1;

vilfred ☆☆
()

Так пойдет?

#!/usr/bin/perl


foreach $i (0..9)
{
    ${"aaa_$i"} = $i;
}

print "$aaa_1\n";
print "$aaa_2\n";
print "$aaa_3\n";
print "$aaa_4\n";
print "$aaa_5\n";
print "$aaa_6\n";
print "$aaa_7\n";
print "$aaa_8\n";
print "$aaa_9\n";

DRuG
()
Ответ на: комментарий от DRuG

warning можно не отключать, а strict все же придется

DRuG
()
Ответ на: комментарий от gr_buza

> vim и юзаю :) начнем-с холивар? :))

вот те хрен. я тоже vim юзаю

и неоднократно убедился что в подобных случаях проще всего сделать 'q' нужой правки и повторить 20 раз

либо воспользоваться шаблоном/генератором; не знаю уж что там в перле для таких случаев есть, но наверняка не менее одного подходящего варианта (а учитывая наличие в виме встроенного перла можно сваять нехитрый скрипт и шаблон запихать в тот же файл в комментариях)

anonymous
()
Ответ на: комментарий от anonymous

да тут-то вопросов нет, мне кажется, что это с точки зрения стиля неправильно.

чтож, работающую версию оставим, а эту с нуля переделаем.

З.Ы. прога - простейший парсер логов, считает, кто сколько и куда наговорил (логи с атски).

gr_buza ★★★★
() автор топика

Можно попробовать в рантайме создать пакет с объявлениями, а потом eval-ом его подключить.

Xellos ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.