Perlでstdinまたは入力ファイル(提供されている場合)からプログラムで読み取る最もスムーズな方法は何ですか?
while (<>) {
print;
}
コマンドラインで指定されたファイルまたはファイルが指定されていない場合は標準入力から読み取ります
コマンドラインでこのループ構成が必要な場合、 -n
オプションを使用できます。
$ Perl -ne 'print;'
ここでは、最初の例の{}
の間にコードを入れて、2番目の''
に入れます
これにより、名前付き変数が提供されます。
foreach my $line ( <STDIN> ) {
chomp( $line );
print "$line\n";
}
ファイルを読み込むには、次のようにパイプします。
program.pl < inputfile
特定の状況で「最も洗練された」方法は、 _-n
_ switch を利用することです。暗黙的にコードをwhile(<>)
ループでラップし、入力を柔軟に処理します。
_slickestWay.pl
_で:
#!/ usr/bin/Perl -n BEGIN:{ #ここで一度何かを行う } #入力の単一行のロジックを実装します print $ result;
コマンドラインで:
_chmod +x slickestWay.pl
_
次に、入力に応じて、次のいずれかを実行します。
ユーザーの入力を待つ
_./slickestWay.pl
_
引数で指定されたファイルから読み取ります(リダイレクトは不要です)
_./slickestWay.pl input.txt
./slickestWay.pl input.txt moreInput.txt
_
パイプを使用する
_someOtherScript | ./slickestWay.pl
_
_-M
_でシバンに追加できるText :: CSVなどのオブジェクト指向インターフェイスを初期化する必要がある場合、BEGIN
ブロックが必要です。
_-l
_と_-p
_も友達です。
<>演算子を使用する必要があります。
while (<>) {
print $_; # or simply "print;"
}
次のように圧縮できます。
print while (<>);
任意のファイル:
open F, "<file.txt" or die $!;
while (<F>) {
print $_;
}
close F;
できない上記のennuikillerが提供するシンプルなソリューションを使用する理由がある場合、Typeglobsを使用してファイルハンドルを操作する必要があります。これはより多くの作業です。この例では、$ARGV[0]
のファイルから$ARGV[1]
のファイルにコピーします。ファイルが指定されていない場合、デフォルトはそれぞれSTDIN
とSTDOUT
になります。
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($_);
}
行う
$userinput = <STDIN>; #read stdin and put it in $userinput
chomp ($userinput); #cut the return / line feed character
1行だけを読みたい場合
コマンドライン入力を取得したり、テキストファイルをリダイレクトしたりできるスクリプトを作成した方法を次に示します。
if ($#ARGV < 1) {
@ARGV = ();
@ARGV = <>;
chomp(@ARGV);
}
これにより、ファイルの内容が@ARGVに再割り当てされ、そこから誰かがコマンドラインオプションを含めているかのように@ARGVを処理します。
[〜#〜] warning [〜#〜]
ファイルがリダイレクトされない場合、STDINからの入力を待機しているため、プログラムはアイドル状態になります。
STDINの問題を解消するために、まだファイルがリダイレクトされているかどうかを検出する方法がわかりません。