简单问题:
我想写一个像say
这样的函数。
但它有一个不好的功能:文件句柄。
say FILEHANDLE LIST
say FILEHANDLE
say LIST
say
如何申报?有可能吗?
P.S:
我找到了myopen(*;$)
的例子,但这不是一回事
P.P.S:
我在旧的Perl版本中需要这个函数,因为编写print "\n"
谢谢!
答案 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。