Perltex 全局使用严格模式

3
为了保持代码的简洁和明确,我通常会进行以下操作:
use strict;

当编写Perl程序时,我希望在perltex中也保持这个习惯。
那么,我应该把use strict;语句放在哪里,以便它控制所有后续的\perldo\perlnewcommand\perlnewenvironment\perlrenewcommand\perlrenewenvironment调用?
以下是一个perltex示例文件,可以正常运行而不会引发错误:
\documentclass[12pt]{article}

\usepackage{perltex}

    \perldo{
        my $scalar = "ok";
        our @array = qw( array is fine );
        %HASH = (
            subject => "hash",
            result => "perfect"
        );
        use strict;
    }

    \perlnewcommand\printscalar{
        return $scalar;
    }

    \perlnewcommand\printarray{
        return join ", ", @array;
    }

    \perlnewcommand\printhash{
        return join ", ", map { sprintf "%s = %s", $_, $HASH{$_} } keys %HASH;
    }

\begin{document}
    Scalar: \printscalar

    Array: \printarray

    Hash: \printhash
\end{document}

它产生类似于

typeset output text

没有引发错误表明在\perldo的顶部参数中使用的use strict;\printscalar的定义中被忽略了。结果还显示由于my$scalar的设置不再被知道了。为了避免这种错误,我希望在引入新变量时忘记指定my our 时收到一个错误消息:

"$scalar"全局符号需要显式包名称

解决问题的方法是包含语句:

use strict;

在所有的\perldo命令中,...都需要重复表述,可以使用宏来完成。然而,我想知道是否有可能避免这样的重复表述。

不,env PERL5OPT=w perltex --nosafe perlhash.tex 无法解决问题;当给出上述文件作为perlhash.tex时,它可以正常运行而不会引发所需的错误。 - Bernhard Bodenstorfer
env PERLOPT=-Mstrict perltex --nosafe perlhash.tex 运行时没有出现任何错误提示。 - Bernhard Bodenstorfer
env PERL5OPT=-Mstrict perltex --nosafe perlhash.tex 引发了所需的错误(实际上也拒绝了 %HASH 的声明)。因此,这是我所述问题的一个可能解决方案。问题仍然存在,即是否可以在 perltex 源文件内部实现此功能,以便可以调整 use strict 的适用性。 - Bernhard Bodenstorfer
1个回答

1

perltex CTAN documentation3.2.3节中列出了加载的模块和pragma列表,其中包括use strict;

关于何时使用此选项作为默认值,文档不太清楚,但似乎是在--nosafe下。那么,这个选项应该是切换它并获取那些默认值的方法。

您尝试仅在第一个使用的命令(如\perldo)中设置它吗?那可能就足够了。

--permit选项允许指定Opcode模块中描述的“特征”,使用Safe模块进行描述。虽然我不知道如何直接利用它,但Safe::reval方法下的讨论可能会有所帮助。

我这里没有安装该模块,无法尝试。希望这对您有所帮助。
作为最后的手段,为什么不联系作者呢?您可能已经揭示了一个错误(在文档中),因为观察到的行为似乎与文档相矛盾。此外,这也很可能是可行的添加。

谢谢,就我所了解的,--nosafe和Safe模块涉及沙盒技术,我不认为这会影响"use strict"。 - Bernhard Bodenstorfer
@BernhardBodenstorfer 可以理解的是,它会根据是否设置沙盒来加载该列表。不幸的是,文档中并不清楚 -- 它似乎表明那些被加载了(周期),但你说你得到了其他结果。接下来可能意味着它们在某种情况下被加载,但在另一种情况下则没有(而你得到了这个)。我现在无法尝试 :( - zdim
感谢澄清。不幸的是,事实证明,如果我在上面的perltex输入中省略了"use strict"语句,并从命令行中删除"--nosafe"选项,仍然不会标记错误。因此,无论--nosafe选项如何,"use strict"似乎都没有生效。 - Bernhard Bodenstorfer
特别是,列表中包括Getopt::Long,它应该始终可用,因此use strict;也应该如此。这有点令人困惑。 - zdim
@BernhardBodenstorfer 我明白了。这种行为似乎与文档中的3.2.3章节有冲突(除非我在某些方面上解读有误)。也许可以联系作者?你可能揭示了一个bug。此外,我认为这可以作为一种全局选项来添加。 - zdim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接