1

簡単な質問:

のような関数を書きたいsay

しかし、それには 1 つの悪い機能がありました: ファイルハンドルです。

       say FILEHANDLE LIST
       say FILEHANDLE
       say LIST
       say 

それを宣言する方法は?出来ますか?

PS: の例を見つけましたmyopen(*;$)が、同じではありません。
PPS: 書くのがめんどくさいので、古いバージョンの Perl ではこの関数が必要ですprint "\n"

ありがとう!

4

2 に答える 2

9

Perl6::Sayはまさにそれを行います。

say FILEHANDLE TEXTPerl の通常非常に面倒な間接メソッド呼び出し構文を利用して、構文を巧みにエミュレートします。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;

更新: これをさらに簡単にするために、Perl6::Say またはPerl のバージョンに応じてロードするSay:: Compat をアップロードしました。use feature 'say'

これは、 Devel::Declareをいじらずに得られる最高のものです。

于 2012-11-28T21:08:02.303 に答える
1

sayサブでは再現できません。

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

それを実現するには、呼び出しパーサーと呼び出しチェッカーが必要です。例については、 Syntax::Feature::Loopを参照してください。

于 2012-11-28T21:15:27.200 に答える