1

简单的问题:

我想写一个像say.

但它有一个不好的特性:文件句柄。

       say FILEHANDLE LIST
       say FILEHANDLE
       say LIST
       say 

如何申报?是否可以?

PS:我找到了一个例子myopen(*;$),但它不是一回事。
PPS:我在旧的 Perl 版本中需要这个函数,因为写起来很烦人print "\n"

谢谢!

4

2 回答 2

9

Perl6::Say就是这样做的。

say FILEHANDLE TEXT它利用 Perl 通常非常烦人的间接方法调用语法巧妙地模拟了语法。它加载IO::Handle将每个文件句柄转换为一个对象并创建IO::Handle->say. 现在say FILEHANDLE TEXT其实是FILEHANDLE->say(TEXT)

它确实有警告。从文档...

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,您可能会得到最好的结果。

于 2012-11-28T21:08:02.303 回答
1

say不能由 subs 重新创建。

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

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

于 2012-11-28T21:15:27.200 回答