![]() |
1
25
首先,你应该这样写:
包括原因
如果你想封装它,你可以写:
autodie 是在核心,我将第二次查斯。欧文斯建议使用它。 |
![]() |
2
10
Perl5真的没有宏(有源代码过滤器,但它们既危险又难看,所以即使我也不会将您链接到文档)。函数可能是正确的选择,但您会发现,它使新用户更难阅读您的代码。更好的选择可能是使用
另一种选择,如果你使用
Vim
,是用来
snipMate
. 你只是打字
snipMate文本是
我相信其他编辑器也有类似的功能,但我是Vim用户。 |
![]() |
3
7
源过滤器 如果必须有一个C/CPP风格的预处理器宏,那么可以使用预编译用Perl(或者,实际上,任何语言)编写一个 source filter . 您可以编写相当简单到复杂的Perl类,对源代码的文本进行操作,并在代码进入Perl编译器之前对其执行转换。您甚至可以通过CPP预处理器直接运行Perl代码,以获得在C/CPP中使用的宏扩展的确切类型 Filter::CPP . Filter::Simple 是Perl核心发行版的一部分。使用Filter::Simple,您可以轻松地编写一个简单的模块来执行所描述的宏。举个例子:
然后是一个Perl文件:
根据我的经验,源代码过滤器并没有被广泛使用。我经常看到他们试图加密Perl源代码或幽默的Perl obfuscators . 换言之,我知道可以这样做,但我个人对它们了解不够,不能推荐或说不用它们。 子程式 思南nr openex subroutine 是实现这一目标的好方法。我只想补充一点,您将看到的一个常见的较老的习惯用法涉及传递对typeglob的引用,如下所示:
阅读 perldata 为什么是这样。。。 伪语言 Template::Toolkit 可以用来处理Perl源代码。例如,您可以按照以下行编写模板:
通过Template::Toolkit运行该工具会导致扩展和替换到:
文本编辑器 查斯。欧文斯有一个 method 使用Vim。我使用BBEdit,可以很容易地编写一个文本工厂,用我想要使用的精确且不断发展的open替换open的骨架。或者,您可以在“Perl”文件夹的“Resources”目录中放置一个完成模板。按定义的一系列键时,将使用这些完成骨架。几乎任何严肃的编辑器都会有类似的功能。
Perl::Critic
这种方式。你可以用
使用文本编辑器的两个潜在问题。首先是单向/一次性转换。如果您想更改“宏”的功能,则不能更改,因为“宏”的上一个文本已经被使用。您必须手动更改它们。第二个潜在问题是,如果使用模板表单,则无法将源代码的宏版本发送给其他人,因为预处理是在编辑器中完成的。 别这样!
如果你打字
你会遇到这样的问题:
印刷品:
结论 这里最灵活的解决方案就是编写一个子程序。您的所有代码都在子例程中可见,易于更改,并且调用时间更短。除了代码的可读性之外,没有什么真正的缺点。 Template::Toolkit被广泛使用。您可以编写类似宏的复杂替换,甚至比C宏更复杂。如果您对宏的需求值得学习,请使用Template::Toolkit。
如果你真的想要C风格的宏,你可以使用
筛选器::CPP
. 这可能与
如果要在代码编译之前对其运行Perl单行程序和Perl regex,请使用Filter::Simple。
|
![]() |
4
0
对于像open这样的东西,我认为在分解例程中包含close是很有用的。这里的方法看起来有点古怪,但是封装了一个典型的打开/关闭习惯用法。 sub with_file_do(&$$) { my ($code, $mode, $file) = @_; open my $fp, '>', $file or die "Could not open '$file' for writing:$!"; local $FP = $fp; $code->(); # perhaps wrap in an eval close $fp; } # usage with_file_do { print $FP "whatever\n"; # other output things with $FP } '>', $outfile; 附属的 关键字。 |
![]() |
Imad Hamaidi · 如何使预处理器宏在编译之前对代码求值 2 年前 |
![]() |
Lightsout · 用于填充表的sql连接压缩行 2 年前 |
![]() |
Rogue258 · 在DB2SQL中使用存储过程/宏进行声明和循环 2 年前 |
![]() |
allthem · 将VBA设置为仅在第一次打开电子表格时自动运行 2 年前 |
![]() |
user306080 · 下面的宏在做什么? 2 年前 |
![]() |
Xev · 运行时错误91:对象变量或未设置块 2 年前 |
![]() |
digital illusion · 请参阅宏扩展中的外部板条箱 2 年前 |
![]() |
Aleph · 标识符在C预处理器指令中的作用是什么 2 年前 |
![]() |
Gakuo · 使用lisp循环宏进行高级循环 6 年前 |