3

ファイルハンドルを返すメソッドを持つオブジェクトがあり、そのハンドルから読み取りたい。メソッド呼び出しの直角ブラケットは入力リーダーの閉じ角ブラケットとして解釈されるため、以下は機能しません。

my $input = <$object->get_handle()>;

これは次のように解析されます。

my $input = ( < $object- > ) get_handle() >;

これは明らかに構文エラーです。角度演算子内でメソッド呼び出しを実行する方法はありますか、それともこのように2つのステップに分割する必要がありますか?

my $handle = $object->get_handle();
my $input = <$handle>;
4

4 に答える 4

7

代わりにスペルを検討することもできます。これにより、特殊なケースの代わりに通常の構文を使用することで問題を回避できます。または、スカラーに割り当てることもできます。あなたの選択。<...>readline(...)

于 2010-04-20T03:01:42.113 に答える
3

あなたはそれを壊さなければなりません。<>演算子は、<STDIN>のようなtypeglob、<$ fh>のようなファイルハンドルまたはtypeglobへの参照を含む単純なスカラー変数、または<*。c>のようなglob()関数の引数を想定しています。あなたの例では、実際にはglob('$ object-')を呼び出しています。

<>は実際にはreadline()の呼び出しとして解釈されるため、本当に必要な場合はmy $input = readline( $object->get_handle() );、特にハンドルから複数回読み取る場合は、それがクリーンかどうかはわかりません。

詳細については、 http://perldoc.perl.org/perlop.html#I%2fO-Operatorsを参照してください。

于 2010-04-20T03:00:55.407 に答える
1
my $input = readline($object->get_handle());

また

use IO::Handle;

my $input = $object->get_handle()->getline();
于 2012-01-24T21:21:16.377 に答える
0

ここで演算子を使用し<...>てファイルハンドルを読み取ることはできません。これは、呼び出しよりも複雑なもの<bareword>や呼び出し<$scalar>として解釈されるglob(...)ものがあるため、通常の曖昧性解消のトリックはここでは機能しません。演算子はの<HANDLE>構文糖衣なreadline HANDLEので、次のように書くことができます。

my $input = readline $object->get_handle;

ただし、これをループで実行する場合は、ハンドルをスカラーにキャッシュする方がはるかに効率的です。その後、<...>オペレーターは期待どおりに機能します。

my $handle = $object->get_handle;
while (my $input = <$handle>) {
    ...
}
于 2010-04-20T02:49:11.630 に答える