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;
问题示例:以下是“问题”的示例,我需要使用括号来使用strict 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
这样的文件的最佳做法而言,是否有更好或更典型的使用方法?拉里沃尔怎么做呢?
答案 0 :(得分:0)
您应该require
您的文件。正如您所发现的那样,use
只接受 bareword 模块名称,将myconstants.ph
重命名为.pm
后缀只是为了{{1}是错误的。工作。
选择use
或use
会使没有区别在代码中使用常量时是否需要使用括号。生成的require
文件以与constant
模块相同的方式定义常量,绝大多数情况下您需要的只是裸标识符。一个例外是当你使用常量作为哈希键时,
.ph
不起作用,因为您使用字符串my %hash = { CONSTANT => 99 }
my $val = $hash{CONSTANT}
作为键。相反,你必须写
CONSTANT
您可能还想将my %hash = { CONSTANT() => 99 }
my $val = $hash{CONSTANT()}
封装在require
块中,如下所示
BEGIN
确保代码的所有其他部分都可以使用这些值,包括后续BEGIN {
require 'myconstants.ph';
}
块中的所有内容。
答案 1 :(得分:0)
问题确实出在require
上。
由于require
是将在运行时进行评估的语句,因此不能对解析有任何影响脚本的后半部分。因此,当perl读取MY_CONSTANT
语句中的print
时,它甚至不知道子例程的存在,并将其解析为裸字。
与eval
相同。
一个解决方案,正如其他人提到的那样,是将其放入BEGIN
块中。另外,您也可以自己转发-保管它:
require 'some-file';
sub MY_CONSTANT;
print 'some text' . MY_CONSTANT;
最后,从我的角度来看,我在Perl编程中从未使用过任何ph
文件。