Я хочу использовать perl, чтобы построить график документа как можно более наглядным. Для повторного использования узлов я хочу ссылаться на узлы, используя переменные (или константы, если это проще). Следующий код работает и иллюстрирует идею с типами узлов, представленными литералами или вызовами фабричных функций для a
и b
. (Для простых демонстрационных целей функции не создают узлы, а просто возвращают строку.)
sub a (@) {
return sprintf "a(%s)", join( ' ', @_ );
}
sub b (@) {
return sprintf "b(%s)", join( ' ', @_ );
}
printf "The document is: %s\n", a(
"declare c=",
$c = 1,
$e = b(
"use",
$c,
"to declare d=",
$d = $c + 1
),
"use the result",
$d,
"and document the procedure",
$e
);
Фактический и ожидаемый результат - The document is: a(declare c= 1 b(use 1 to declare d= 2) use the result 2 and document the procedure b(use 1 to declare d= 2))
.
Моя проблема возникает из-за Я хочу use strict
во всей программе, чтобы такие переменные, как $c
, $d
, $e
, были объявлены с использованием my
. Я, конечно, могу написать где-то близко к началу текста my ( $c, $d, $e );
. Было бы более эффективно во время редактирования, когда я мог бы использовать ключевое слово my
непосредственно при первом упоминании переменной, например:
…
printf "The document is: %s\n", a(
"declare c=",
my $c = 1,
my $e = b(
"use",
$c,
"to declare d=",
my $d = $c + 1
),
"use the result",
$d,
"and document the procedure",
$e
);
Это был бы мой любимый синтаксис. К сожалению, этот код выдает несколько Global symbol "…" requires explicit package name
ошибок. (Более того, согласно документации, my
ничего не возвращает.)
У меня есть идея такого использования my
от использования, как в open my $file, '<', 'filename.txt' or die;
или в for ( my $i = 0; $i < 100; ++$i ) {…}
, где объявление и определение go в одном.
Поскольку узлы на графике являются константами, допустимо использовать что-то еще, кроме лексических переменных. (Но я думаю, что встроенные механизмы perl являются самыми сильными и наиболее эффективными для лексических переменных, поэтому я склонен в этом направлении.)
Моя текущая идея решить эту проблему - определить функция с именем что-то вроде define
, которая за кадром будет манипулировать текущим набором лексических переменных, используя PadWalker
или подобное. Однако это не позволило бы мне использовать естественный perl подобный синтаксис, такой как $c = 1
, который был бы моим предпочтительным синтаксисом.