[英]“Use” the Perl file that h2ph generated from a C header?
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
这样的文件的最佳实践,有没有一种更好或更典型的方式使用myconstants.ph
呢? 拉里·沃尔(Larry Wall)会如何做?
您应该require
您的文件。 正如您所发现的那样, use
仅接受裸字模块名称,并且将myconstants.ph
重命名为.pm
后缀以使use
起作用是错误的。
use
或require
的选择与在代码中使用常量时是否需要括号没有区别 。 生成的.ph
文件以与constant
模块相同的方式定义常量,并且在大多数情况下,您需要的是裸标识符。 一个例外是当您将常量用作哈希键时
my %hash = { CONSTANT => 99 }
my $val = $hash{CONSTANT}
不起作用,因为您正在使用字符串CONSTANT
作为键。 相反,您必须写
my %hash = { CONSTANT() => 99 }
my $val = $hash{CONSTANT()}
您可能还需要来包装你require
一个内部BEGIN
块,这样
BEGIN {
require 'myconstants.ph';
}
以确保这些值可用于代码的所有其他部分,包括后续BEGIN
块中的所有内容。
问题确实存在于require
。
由于require
是将在运行时评估的语句,因此它对脚本后半部分的解析 没有任何影响。 因此,当perl在print
语句中读取MY_CONSTANT
时,它甚至不知道子例程的存在,并将其解析为裸字。
eval
也是一样。
正如其他人所提到的,一种解决方案是将其放入BEGIN
块中。 或者,您可以自己转发转发:
require 'some-file';
sub MY_CONSTANT;
print 'some text' . MY_CONSTANT;
最后,从我的角度来看,我在Perl编程中从未使用过任何ph
文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.