Perl:如何声明和实现函数`say`

时间:2012-11-28 20:50:51

标签: perl implementation declaration

简单问题:

我想写一个像say这样的函数。

但它有一个不好的功能:文件句柄。

       say FILEHANDLE LIST
       say FILEHANDLE
       say LIST
       say 

如何申报?有可能吗?

P.S: 我找到了myopen(*;$)的例子,但这不是一回事 P.P.S: 我在旧的Perl版本中需要这个函数,因为编写print "\n"

很烦人

谢谢!

2 个答案:

答案 0 :(得分:9)

Perl6::Say就是这么做的。

通过利用Perl通常非常烦人的indirect method call syntax巧妙地模仿say FILEHANDLE TEXT语法。它加载IO::Handle将每个文件句柄转换为对象并创建IO::Handle->say。现在say FILEHANDLE TEXT实际上是FILEHANDLE->say(TEXT)

确实有警告。来自the docs ...

Use it just like print (except that it only supports the indirect
object syntax when the stream is a bareword). That is, assuming
the relevant filehandles are open for output, you can use any of these:

say @data;
say FH @data;
FH->say(@data);
*FH->say(@data);
(\*FH)->say(@data);
say $fh, @data;
$fh->say(@data);

but not any of these:

say {FH} @data;
say {*FH} @data;
say {\*FH} @data;
say $fh @data;
say {$fh} @data;

更新:为了使这更简单,我刚刚上传了Say::Compat,它会加载Perl6 :: Say或use feature 'say',具体取决于您的Perl版本。

如果不使用Devel::Declare,这是最好的。

答案 1 :(得分:1)

say无法通过潜艇重新创建。

>perl -E"say prototype('CORE::say') // 'Special'"
Special

你需要一个调用解析器和调用检查器来实现它。有关示例,请参阅Syntax::Feature::Loop