为了强制执行清晰明确的代码,我习惯
use strict;
编程Perl时。 我也希望将此习惯保留在 perltex 中。
那么我应该在哪里放置此use strict;
语句,以便它管理所有后续\perldo
,\perlnewcommand
,\perlnewenvironment
,\perlrenewcommand
和\perlrenewenvironment
perltex输入文件中的调用?
以下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}
它产生类似于
的东西没有出现错误,表明use strict;
定义中忽略了\perldo
参数中的\printscalar
$scalar
。结果还显示由于my
而不再知道my
的设置。为避免此类错误,我希望收到错误
全局符号“$ scalar”需要显式包名称
每当我在引入新变量时忘记指定our
或use strict;
时。
我的问题的解决方法是包含声明
\perldo
在所有select staff.fname, staff.role,
patient.pfname, plname, appoitment.aotdate
from staff, patient, appointment
where patient.pid=appointment.patientId
and staff.id=appointment.staffid
,...命令中,这可以使用宏来完成。不过我想知道是否有可能避免这种重新陈述。
答案 0 :(得分:1)
perltex CTAN documentation在 3.2.3 部分中提供了已加载模块和编译指示的列表。这些包括 use strict;
。
当这是默认设置时,文档有点不清楚,但它似乎在--nosafe
下。然后,此选项应该是切换它并获取这些默认值的方法。
您是否尝试仅在使用的第一个命令(例如\perldo
)中进行设置?这可能就够了。
--permit
选项允许指定Opcode模块中描述的“功能”,使用模块Safe完成的操作。虽然我没有看到如何直接使用此功能,但Safe::reval
方法下的讨论可能会有所帮助。
我这里没有安装模块,也无法尝试。我希望这有一些用处。
作为最后的手段,为什么不联系作者?您可能已经发现了一个错误(在文档中),因为观察到的行为似乎与文档冲突。此外,这可能是可行的。