繁体   English   中英

“使用” h2ph从C标头生成的Perl文件?

[英]“Use” the Perl file that h2ph generated from a C header?

h2ph实用程序从C头文件生成一个.ph“ Perl头”文件,但是使用此文件的最佳方法是什么? 像,应该是requireuse

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起作用是错误的。

userequire的选择与在代码中使用常量时是否需要括号没有区别 生成的.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM