Хотел я сохранить описание огроменного и сложного статичного хэша в отдельный файлик, чтобы не мозолил глаза и чтобы можно было разные файлики подцеплять, используя ключ командной строки.
Но сохранить - это только четверть дела, ведь самое важное - правильно загрузить сохранённое.
Конструкция eval с чтением целиком файла отлично работает, всё ОК. Но у eval есть большой недостаток - он медлительный и лучше его в принципе использовать только для перехвата ошибок без такого дикого треша, как повторная интепретация строк кода прямо в рантайме.
Ну и решил я загрузить файлик конструкцией do «file.pl»
И жестоко обломался, потому что variable scope содержимого файлика почему-то отличается от scope'а вызывающей программы, что по сути конечно немного треш и угар. То есть если даже сказать в основной программе «my $a='hello';» и потом загрузить файлик, содержащий «$a='Hows that';», то в $a, внезапно, останется строка 'hello'.
$ echo -e '#!/usr/bin/perl\n$a="bye";' > a.dat
$ cat a.dat
#!/usr/bin/perl
$a="bye";
$ perl -e 'my $a="hello"; do "a.dat"; print "$a\n";'
hello
$ perl -e 'our $a="hello"; do "a.dat"; print "$a\n";'
bye
$ perl -e 'my $a="hello"; open(FH,"<a.dat"); undef $/; eval <FH>; print "$a\n";'
bye
Вопрос: как сделать include файла на языке perl в программе на языке perl, чтобы variable scope всего включаемого совпадал со scope вызывающей программы? Возможно ли это сделать без eval?