【发布时间】:2018-08-03 19:50:27
【问题描述】:
h2ph 实用程序从 C 头文件生成 .ph“Perl 头”文件,但使用此文件的最佳方法是什么?比如,应该是require还是use?:
require 'myconstants.ph';
# OR
use myconstants; # after mv myconstants.ph myconstants.pm
# OR, something else?
现在,我正在使用上面显示的use 版本,因为使用它我不需要在常量后面输入括号。我想输入 MY_CONSTANT 而不是 MY_CONSTANT(),我在需要常量的 Perl 文件中有 use strict 和 use warnings。
虽然对这个文件做一个use 有点奇怪,因为它没有声明模块名称,而且它似乎并不是特别打算成为一个模块。
我只有一个文件正在通过 h2ph 运行,而不是一百个或其他任何文件。
我看过perldoc h2ph,但它根本没有提到预期的导入机制的主题。
示例输入和输出:为了进一步了解背景,这里是一个示例输入文件以及 h2ph 从中生成的内容:
// File myconstants.h
#define MY_CONSTANT 42
...
# File myconstants.ph - generated via h2ph -d . myconstants.h
require '_h2ph_pre.ph';
no warnings qw(redefine misc);
eval 'sub MY_CONSTANT () {42;}' unless defined(&MY_CONSTANT);
1;
问题示例:这是一个“问题”示例,我需要使用括号来获取代码以使用 use strict 进行编译:
use strict;
use warnings;
require 'myconstants.ph';
sub main {
print "Hello world " . MY_CONSTANT; # error until parentheses are added
}
main;
会产生以下错误:
Bareword "MY_CONSTANT" not allowed while "strict subs" in use at main.pl line 7.
Execution of main.pl aborted due to compilation errors.
结论:那么有没有更好或更典型的方法来使用它,只要遵循导入像myconstants.ph 这样的文件的最佳实践吗? Larry Wall 会怎么做呢?
【问题讨论】:
-
请不要写
sub main { } main;。这不是 C。Perl 程序自动在package main中运行,如果它只运行一次,没有理由将任何代码分解为sub。当你把你的代码分解出来时,总是用括号来调用你的潜艇(例如main();)。 -
我执行 main 函数有一个非常实际的原因:当我进入调试器时,我可以键入“c ::main”,然后立即跳转到我关心的代码,否则它可以在 Perl 中到达该行有点麻烦,特别是因为在调试器中启动时发生的事情因您拥有的 use 语句而异。如您所见,我不认为 Perl 是 C,因为这个问题与 保持 Perl 不使用括号的能力密切相关,这与 C 非常不同。如果您认为始终使用它是最佳实践parens,就像 C 一样,嗯,TMTOWTDI,对吧?