ネストコードの意味は何ですか
foreach (@items)
{
if (-l $_) ## this is what I don't understand: the meaning of -l
{
...
}
}
助けてくれてありがとう。
ネストコードの意味は何ですか
foreach (@items)
{
if (-l $_) ## this is what I don't understand: the meaning of -l
{
...
}
}
助けてくれてありがとう。
それぞれを見てみましょう:
foreach (@items) {
...
}
このfor
ループ(foreach
およびfor
Perlの同じコマンド)は、@items
リストから各項目を取得し、それをに設定し$_
ます。は$_
、デフォルト変数の一種として使用されるPerlの特別な変数です。アイデアはあなたがこのようなことをすることができるということです:
foreach (@items) {
s/foo/bar/;
uc;
print;
}
そして、それらの各コマンドはその$_
変数を操作します!何も言わずに言うprint
と、にあるものは何でも印刷され$_
ます。変数について言及していない場合はuc
、にあるものはすべて大文字になります$_
。
現在、これはいくつかの理由で推奨されていません。まず、グローバル$_
であるため、意図しない副作用が発生する可能性があります。たとえば、の値をいじくり回したサブルーチンを呼び出すと想像してください。プログラムが機能しないことに突然驚かれることでしょう。$_
もう1つ-l
はテストオペレーターです。この演算子は、指定されたファイルがシンボリックリンクであるかどうかを確認します。すべてのテスト演算子を説明するPerldocにリンクしました。
UnixまたはBASH/Korn / Bourneシェルスクリプトに精通していない場合、ダッシュで始まるコマンドがあると奇妙に見えます。しかし、Perlの構文の多くが盗まれました...つまり、Unixシェルとawkコマンドから借用したということです。Unixには、次のように使用できるtestというコマンドがあります。
if test -L $FILE
then
....
fi
Unixでは、これ-L
はテストコマンドのパラメーターであり、Unixでは、コマンドのほとんどのパラメーターはダッシュで始まります。Perlは単に同じ構文ダッシュとすべてを借用しました。
興味深いことに、これらのテストコマンドのPerldocを読むと、foreach
ループのよう$_
に、変数またはファイル名を指定しない場合、さまざまなテストコマンドが変数を使用することに気付くでしょう。そのスクリプトを書いた人は誰でも、次のようにループを書くことができたはずです。
foreach (@items)
{
if (-l) ## Notice no mention of the `$_` variable
{
...
}
}
ええ、それはすごい明らかです!
参考までに、多くのPerlエキスパート(咳ダミアンコンウェイ咳)が推奨する最新の方法は、変数をできるだけ避けることです。これは、実際には明確さを追加せず、問題を引き起こす可能性があるためです。彼はまた、ただ言って忘れて、同じ行に中括弧を使用することをお勧めします。 $_
for
foreach
for my $file (@items) {
if ( -l $file ) {
...
}
}
それはコマンドには役立たないかもしれません-l
が、少なくともファイルを扱っていることがわかるので、それがファイルと関係があるので-l
はないかと疑うかもしれません。
残念ながら、Perldocはこれらすべてのファイルテストをセクションの下に置き、X-X
の下にアルファベット順に並べています。そのため、Perldocでコマンド、またはダッシュで始まるコマンドを検索している場合、知らない限りそれを見つけることはできません。ただし、少なくとも、次のようなものが表示されたときにどこを見ればよいか、将来的にはわかっています。-l
-s $file
ファイルがシンボリックリンクかどうかをチェックする演算子です。
perldocから:
-l File is a symbolic link.