標準入力 <STDIN>
<STDIN> は、標準入力(キーボードからの入力) からコンテンツを読み取ることを意味します。入力がない場合は待機し続け、デフォルトで読み取られるコンテンツには改行文字が含まれます。
#!/usr/bin/perl
use 5.10.1;
my $line = <STDIN>;
if($line -eq "\n")
{
print("blank line\n");
}
else
{
chomp($line);
print("not blank:$line\n");
}
<STDIN>標準入力の末尾は改行文字 \n を意味し、入力に改行文字が見つかった場合は読み取りが終了し、次のように改行文字の後の内容は読み取られません。
echo "hello\nworld" | perl stdin.pl
perl スクリプトでは hello\n のみが読み取られますが、world は読み取られません。
<STDIN> は標準入力を読み取るため、ファイルの内容を読み取りたい場合は、次のようにシェルのリダイレクト機能を使用する必要があります。
perl stdin.pl <a.txt
ただし、上記のコードは a.txt の 1 行しか読み取れません。すべてのコンテンツを読み取りたい場合は、while ループを使用する必要があります。
while(defined($line=<STDIN>))#推荐
{
print("$line");
}
foreach(<STDIN>)#不推荐
{
print("$_");
}
上のwhileループでは、標準入力から1行読み込んで変数$lineに毎回代入し、変数が定義されているかチェックする; 読み込んだ内容を変数に代入することもできず、読み込んだ内容は上記の foreach ループのように、デフォルトで変数$_に格納されます。
ただし、上記の 2 つのループのトラバーサル メソッドは異なります。while はスカラー コンテキストです。つまり、一度にファイルの 1 行だけが読み取られます。一方、foreach はリスト コンテキストであり、最初にすべてのファイルをリストに読み取ります。、次にリスト内で一度に 1 つの要素を取得します。この foreach の方法はお勧めしません! !
デフォルトの変数 $_ は <STDIN> と直接関係がないことに注意してください。ただし、上記のループ本体では、デフォルトで読み取った内容が変数 $_ に割り当てられます。
ファイル入力の読み取り<>
Perl は2 つの山かっこ記号を使用して、コマンド ラインから入力ソースとしてファイルを渡すなど、ファイルから入力を 1 行ずつ読み取ります。これらの 2 つの山かっこは、ひし形演算子と呼ばれます。標準入力
while (defined($line = <>))
{
print("$line");
}
#简化版
while (<>)
{
print("$_");
}
次に、コマンド ラインで入力ファイルを指定して、次のようにファイルの各行が順番に読み込まれるようにします。
perl zuanshi.pl a.txt
入力ファイルを読み取った後、ひし形演算子に標準入力の読み取りを継続させたい場合は、次のようにコマンド ラインに-を追加するだけです。
perl zuanshi.pl a.txt -
上記のコマンドがダイヤモンド オペレーターで a.txt を順番に読み取った後、標準入力を読み取ります。ダイヤモンド オペレーターは、次のように、開いているファイルを順番に読み取ることもできます。
open FILE, "a.txt"
while(defined(<FILE>))#依次读取a.txt的每一行
{
print "$_";
}
close FILE;
むしゃむしゃ
前述のように、 <STDIN> と <> は両方とも、入力を読み取るときにデフォルトで改行文字を読み取り、 chomp を使用して文字列から改行文字を削除するか、 input を読み取ります;形式は次のとおりです:
chomp(标量);
#不带参数的话,默认参数为默认变量$_
この関数は文字列をその場で変更しますが、この関数には独自の戻り値があることに注意してください。
- 改行文字を削除できる場合は、削除された文字数が返されます。値は 1 です。すでにわかっているように、これは役に立たない戻り値です。
- 改行文字がない場合は、値 0 が返されます。
- 最後に 2 つの改行がある場合、1 つだけが削除されます。
一般的に言えば、while ループで <> または <STDIN> を使用して入力を読み取った後 (open キーワードでファイルを開いてから行を読み取る場合を含む)、最初の行は末尾の改行文字を削除することです。そのため、ほとんどの場合、次の一般的な形式が使用されます。
while (<FILE_HANDLE>)
{
chomp;
commands;
}
while (<STDIN>)
{
chomp;
commands;
}
Perl 出力関数
print say printf と sprintf は文字列をディスプレイに出力でき、4 つの関数の適用シナリオは異なります。
print と say の違いは次のとおりです。print には改行がありませんが、 say には独自の改行があります。
printf を使用して出力をフォーマットします。使用方法は C 言語と同じです。
一般的に使用される print/say について、注意すべき点が 1 つあります。
print (3+4)*4
上記は 28 ではなく 7 を返しますが、これはどのように計算されますか?
Perl では括弧を省略できることが多く、括弧の帰属を忘れがちです.Perl にはコンテキストの概念もあります.異なるコンテキストで同じ操作を実行すると、結果が異なります.
- print が括弧を追加しない場合、必要なパラメーターはリスト コンテキストであり、それ以降のすべてのコンテンツが print によって出力されます。つまり、print の後のすべての文字列が順番に出力されます。
- print が括弧を追加すると、括弧内のコンテンツのみが出力されます
したがって、上記のステートメントは次と同等です。
(print (3+4))*4
最初に print(7) を実行し、次に print の戻り値 1 を取得し、それを 4 で乗算します。他の変数には代入されていないため、この乗算の結果は破棄されます。
さらに、print/say は括弧を使用しないため、その後ろにリストを出力するので、次のようなトリックがあります。
- cat と同様に、print <> を使用して、ファイルのすべての内容を読み取って出力できます。
- sort と同様に、print sort <> を使用してファイルの内容をソートできます。
printf の例を見てみましょう。
my @items = qw/aaa bbb ccc/;
printf "%d\n"x@items, @items;
打印结果如下:
aaa
bbb
ccc
perl には python と同様の操作があり、文字列はxを介して複数回コピーされていることがわかります。
perl コマンド ライン引数
Perl のコマンド ライン パラメータは、デフォルトで配列 @ARGVに保存されます. これは配列であるため、次のように$ARGV[index] ;を介して配列要素にアクセスし、トラバースし、さらには変更することもできます:
perl test.pl a b c
abc は ARGV[0]、ARGV[1]、ARGV[2] に順番に格納されます; デフォルトでは、perl はこれらのパラメータを perl プログラムのデータ入力ソースと見なします。ターン;
ARGV 変数と ARGV 配列を区別する必要があります。
- $ARGV は、コマンド ライン引数リストで現在処理されているファイル名を示します
- @ARGV は、コマンドライン引数の配列を表します
- $ARGV[n] は、コマンドライン引数配列の要素を表します
- ARGV は <> 現在処理中のファイルハンドルを意味します