2011-03-06 2 views
2

Perlの角度演算子をPythonジェネレータと同等のものとして使用するいくつかのモジュール(例:Iterator::Simple)を見てきました。具体的には、リスト全体を実際にメモリにロードせずに値のリストを反復処理する機能を提供します。これは一般的にオペレータの機能の適切な延長と考えられているのですか、それともそれを悪用していると考えられますか?一般的なイテレータ/ジェネレータとしてPerlのファイル入力角度演算子をオーバーロードすることは適切ですか?

答えて

6

演算子<HANDLE>演算子は、readline HANDLE関数の構文砂糖にすぎません。これは、ハンドルのイテレータに非常によく似ています。オブジェクトが反復アクセスを提供する場合、私は<>のオーバーロードに問題はなく、エンドユーザに柔軟性を提供します。

<>演算子はジェネレータに近似しない​​ため、モジュールはそれを行います。すべてのこと

while (<$iterator>) {...} 

はあなたを与える

while (defined ($_ = $iterator->next)) {...} 

Perlを書くためのファンシーな方法は、それはあなたが問題を解決することを可能にするさまざまな方法による非常に表情豊かな言語です。多くのモジュールは、このような考え方で代替インタフェースを提供することを選択しています。これにより、ユーザーは自分にとって最適な方法をコーディングすることができます。

+0

これが動作しない、オーバーロードされたので、オペレータは、 '<>'一度だけ呼ばれています! – Jakob

+0

@Jakob =>あなたが話しているかわから 'しばらく(<$itr>){...}'構築物に、オーバーロードされた演算子は、各ループ反復で呼び出されません。 –

+0

申し訳ありませんが、私は間違っています: '<>' whileループで動作しますが、 'my @all = <$iterator>'や 'foreach(<$iterator>)'を行うことはできませんので、この落とし穴を指摘しない限り。 – Jakob

関連する問題