Perl - 閉じる中括弧が開く中括弧の前に来ます。どのように動作しますか?

Perl - 閉じる中括弧が開く中括弧の前に来ます。どのように動作しますか?

私は偶然会ったこのソリューションファイルの内容を逆に置き換えます。

$ cat f1
abc
def
ghi
jkl

$ perl -ne 'push @arr,$_;}{print reverse @arr;' f1
jkl
ghi
def
abc

校正器がどのように機能するかを説明できる人はいますか?混乱しています。右角かっこが左角かっこの前に来ます。

ベストアンサー1

-nこれは、スイッチが実際にソースコードの周りに中かっこを追加するためです。 〜のように手動説明する:

-n Perlは、プログラムの周りに次のループがあると仮定して、sed -nまたは同じファイル名引数を繰り返すようにしますawk

LINE:
  while (<>) {
      ...             # your program goes here
  }

これは、Perlがプログラムの周りに同じループを実行するという意味ではありません。実際にここに示されている接頭辞と接尾辞を追加します(間隔は異なります)。ソースコード引用(toke.c):

            if (PL_minus_n || PL_minus_p) {
                sv_catpvs(PL_linestr, "LINE: while (<>) {"/*}*/);

そして

        } else if (!PL_in_eval && PL_minus_n) {
            sv_catpvs(linestr, /*{*/";}");

この関数は、sv_catpvs解析するソースコードを含む中間バッファに指定された文字列を追加します。私は改行文字が以前に挿入されたと思います;}(文字列でコメントアウトされていないため)#-eこれら2つの呼び出しの間にどこかに-e何かが追加されます。

-p、などの他のスイッチも-F同様に-E機能します。

したがって、コード例が実行されます。

LINE: while (<>) {push @arr,$_;}{print reverse @arr;;}

適切な間隔があればそうです。

LINE: while (<>) {
    push @arr,$_;
}
{
    print reverse @arr;
    ;
}

未使用のタグ、2番目の中括弧セット(グループ化には不要)、および空のディレクティブ(lone ;)を削除します。つまり、次のようになります。

while (<>) {
    push @arr,$_;
}
print reverse @arr;

ループは@arr順番に行を追加し、ループの後のコマンドはそれを逆の順序で印刷します。

おすすめ記事