2

データがパイプされている場合、またはファイルが提供されている場合は、デフォルトの入力から読み取りたいのですが、何も指定されていない場合は、while(<>)実行するためのデフォルトを提供したいと考えています。

擬似コード:

if(!<>){
  <> = system("ls | ./example.pl");
}

while(<>){
...
...
...
}
4

2 に答える 2

5

あなたの「データがパイプされている場合」は物事を難しくします。言うのは簡単です

if (!@ARGV) {
    @ARGV = ("somedefault");
}

while (<>) {
    ...
}

これは、コマンドラインでファイル名が指定されていない場合、"somedefault" で動作します — しかし、コマンドラインにファイル名がない場合、stdin から読み取るという Perl のデフォルトは取得されないことを意味します。

考えられる妥協案の 1 つは、-t 演算子を使用してstdin が端末かどうかを推測することです。

if (!@ARGV && -t STDIN) {
    @ARGV = ("somedefault");
}

コマンドラインにファイル名がなく、標準入力が端末に接続されている場合は「somedefault」を使用しますが、ファイル名がなく、標準入力がファイルまたはパイプからリダイレクトされている場合は標準入力を使用します。これは少し魔法のようですが (面倒かもしれませんが)、要求どおりに機能します。

于 2012-01-27T01:28:09.863 に答える
4

から読み取ろうとして<>、何も読み取れなかった場合はデフォルトに戻すのはどうですか?

while (my $line = <>)
{
     do_stuff($line);
}

# if no lines were read, fall back to default data source
if (not $.)
{
     while (my $line = <SOMETHING_ELSE>)
     {
          do_stuff($line);
     }
}

$.この変数については、ここの perldoc perlop で読むことができます。これは、読み取った最新のファイルハンドルの「現在の」行番号を示します。未定義の場合、から読み取るものはありませんでした<>

于 2012-01-27T01:39:35.227 に答える