Perl の入出力

標準入力 <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 は <> 現在処理中のファイルハンドルを意味します

おすすめ

転載: blog.csdn.net/bleauchat/article/details/118380236