Perl PadWalker не отображает переменные, объявленные как "наш"
Возникли некоторые проблемы с отладчиком Perl в Eclipse и PadWalker. Ранее использовал его только для простых однофайловых скриптов. Переменные, объявленные с использованием "my". Они хорошо отображаются в окне "переменных" отладчика.
Сейчас я использую более сложный скрипт другого пользователя и не вижу переменных, объявленных с использованием нашего. Чтобы исследовать, я свел это к одному очень простому примеру
junk.pl:
use strict;
use warnings;
require 'junk2.pl';
package Junk;
my $simon = "SOMETHING";
print "JUNK " . $Junk2::james . "\n";
print "JUNK " . $simon . "\n";
junk2.pl:
package Junk2;
our $james;
$james = "FOO";
1;
Пошаговый код my $simon
отображается в окне отладчика нормально, но переменная our $james
не. Отладчик работает нормально: программа запускается, и окно вывода показывает правильный вывод... это просто окно переменных, которое не отображается $james
,
Снимок экрана ниже демонстрирует проблему. Как вы можете видеть переменную $james
из пакета Junk2 печатает нормально, но не отображается на дисплее переменных.
Некоторое время искали решение, но не можете найти ничего подходящего... какие-нибудь идеи?
РЕДАКТИРОВАТЬ: обнаружили, что я могу "видеть" переменные пакета, если я использую отладчик Perl:,
Есть ли способ получить такой же вывод дружественным образом в IDE, как показывает падвалкер?
Спасибо ребятам, которые до сих пор ответили:)
3 ответа
Вы можете переключить просмотр локальных и глобальных переменных в меню просмотра переменных. Переменные, объявленные с нашим, находятся за пределами локальной области видимости и поэтому видны, когда выбрана опция глобальных переменных. (Я запускаю затмение 4.2.1)
Чтобы получить доступ к меню просмотра переменных, нажмите маленькую стрелку вниз в правом верхнем углу панели переменных.
Переменные, объявленные с помощью нашего, являются лексическими переменными, псевдонимом которых являются переменные пакета (спасибо @ikegami за исправление):
our
создает лексический псевдоним для переменной пакета с тем же именем в текущем пакете для использования в текущей лексической области.
Брайан Д. Фой недавно опубликовал пост, в котором обсуждаются таблицы символов.
Короткий ответ: вы обращаетесь к переменным пакета, просматривая таблицу символов пакета.
Кроме того, PadWalker имеет peek_our
метод. Package:: Stash предоставляет другие полезные помощники.
В конфигурации отладки Eclipse в -X к командной строке Perl, чтобы показать текущие переменные пакета.
Редактировать:
В этом случае вам может понадобиться использовать команду -V. См. http://perldoc.perl.org/perldebug.html
Редактировать:
Вероятно, было бы проще просто присвоить переменную Junk2::James локальной переменной.
мои $james = $Junk2::james;