web-dev-qa-db-ja.com

プログラムでSTDINまたはPerlの入力ファイルから読み取る

Perlでstdinまたは入力ファイル(提供されている場合)からプログラムで読み取る最もスムーズな方法は何ですか?

66
syker
while (<>) {
print;
}

コマンドラインで指定されたファイルまたはファイルが指定されていない場合は標準入力から読み取ります

コマンドラインでこのループ構成が必要な場合、 -n オプションを使用できます。

$ Perl -ne 'print;'

ここでは、最初の例の{}の間にコードを入れて、2番目の''に入れます

80
ennuikiller

これにより、名前付き変数が提供されます。

foreach my $line ( <STDIN> ) {
    chomp( $line );
    print "$line\n";
}

ファイルを読み込むには、次のようにパイプします。

program.pl < inputfile
44
Ron

特定の状況で「最も洗練された」方法は、 _-n_ switch を利用することです。暗黙的にコードをwhile(<>)ループでラップし、入力を柔軟に処理します。

_slickestWay.pl_で:

#!/ usr/bin/Perl -n 
 
 BEGIN:{
#ここで一度何かを行う
} 
 
#入力の単一行のロジックを実装します
 print $ result; 

コマンドラインで:

_chmod +x slickestWay.pl
_

次に、入力に応じて、次のいずれかを実行します。

  1. ユーザーの入力を待つ

    _./slickestWay.pl
    _
  2. 引数で指定されたファイルから読み取ります(リダイレクトは不要です)

    _./slickestWay.pl input.txt
    ./slickestWay.pl input.txt moreInput.txt
    _
  3. パイプを使用する

    _someOtherScript | ./slickestWay.pl 
    _

_-M_でシバンに追加できるText :: CSVなどのオブジェクト指向インターフェイスを初期化する必要がある場合、BEGINブロックが必要です。

_-l_と_-p_も友達です。

14
Neil Best

<>演算子を使用する必要があります。

while (<>) {
    print $_; # or simply "print;"
}

次のように圧縮できます。

print while (<>);

任意のファイル:

open F, "<file.txt" or die $!;
while (<F>) {
    print $_;
}
close F;
13
el.pescado

できない上記のennuikillerが提供するシンプルなソリューションを使用する理由がある場合、Typeglobsを使用してファイルハンドルを操作する必要があります。これはより多くの作業です。この例では、$ARGV[0]のファイルから$ARGV[1]のファイルにコピーします。ファイルが指定されていない場合、デフォルトはそれぞれSTDINSTDOUTになります。

use English;

my $in;
my $out;

if ($#ARGV >= 0){
    unless (open($in,  "<", $ARGV[0])){
      die "could not open $ARGV[0] for reading.";
    }
}
else {
    $in  = *STDIN;
}

if ($#ARGV >= 1){
    unless (open($out, ">", $ARGV[1])){
      die "could not open $ARGV[1] for writing.";
    }
}
else {
    $out  = *STDOUT;
}

while ($_ = <$in>){
    $out->print($_);
}
8
Sigusr2

行う

$userinput =  <STDIN>; #read stdin and put it in $userinput
chomp ($userinput);    #cut the return / line feed character

1行だけを読みたい場合

6

コマンドライン入力を取得したり、テキストファイルをリダイレクトしたりできるスクリプトを作成した方法を次に示します。

if ($#ARGV < 1) {
    @ARGV = ();
    @ARGV = <>;
    chomp(@ARGV);
}


これにより、ファイルの内容が@ARGVに再割り当てされ、そこから誰かがコマンドラインオプションを含めているかのように@ARGVを処理します。

[〜#〜] warning [〜#〜]

ファイルがリダイレクトされない場合、STDINからの入力を待機しているため、プログラムはアイドル状態になります。

STDINの問題を解消するために、まだファイルがリダイレクトされているかどうかを検出する方法がわかりません。

0
Westrock