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

时间:2015-02-20 08:27:14

标签: c perl

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 strictuse 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这样的文件的最佳做法而言,是否有更好或更典型的使用方法?拉里沃尔怎么做呢?

2 个答案:

答案 0 :(得分:0)

您应该require您的文件。正如您所发现的那样,use只接受 bareword 模块名称,将myconstants.ph重命名为.pm后缀只是为了{{1}是错误的。工作。

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