私は偶然会ったこのソリューションファイルの内容を逆に置き換えます。
$ 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
順番に行を追加し、ループの後のコマンドはそれを逆の順序で印刷します。