開発者がデフォルト変数$_
を使用しているという混乱の一部があります。関数内で変数の名前を指定しないと、Perlの多くのコマンド(約1/3はコマンド)が$_
になります。例えば、これらは構文的に同一である。両方の場合において
my $uppercase_name = uc($_);
my $uppercase_name = uc;
、uc
関数は大文字で$_
変数の文字列を印刷します。実際には、print
文でも変数$_
が使用されます。ここでも、これらは両方とも同じです。
print $_;
print;
それがプログラムに明確さを追加しないと、それはより速くプログラムを作成していないため、より新しいPerlスクリプトで、デフォルトの変数を使用するようにひんしゅくを買うです。私は、欠落した$_
変数を表示するために使用したのと同じコードスニペットを書き直しました。 while
文が$_
変数に読み込む行の値を入れていることと代替コマンド(s/^\s+//
)も$_
上で動作していることを
open(FILE, "cat $fileName |") || die "could not open file";
while ($_ = <FILE>)
{
$_ =~ s/^\s+//;
my @line = split $_;
if ($line[0] !~ /\:/) {
$mark = 0;
}
my $var = $line[$mark];
## some other code
}
お知らせ:それは理解し、コードが簡単になるかもしれません変数。私はあなたのためのコードを明確にすることを願っています。ご質問のために今
:
_ [W]帽子ん '|'と '||'立つ?
||
はこのまたはそのを行うのようにまたはを意味します。実際には、またはは、if文と考えることができます。
if (not open(FILE, "cat $fileName |")) {
die "could not open file";
}
オープン文がdie
文を実行し、失敗した場合、すなわち。開いているステートメントでファイルを開くことができた場合は、die
ステートメントを実行しないでください。 Perlで
、あなたは今、このようなケースではor
の代わり||
参照:
open(FILE, "cat $fileName |") or die "could not open file";
意味がもう少し明らかになりた:ファイルを開く、またはプログラムを強制終了します。
ファイル名の末尾にある単一のパイプ(|
)は、openステートメント(cat $filename
)でコマンドを実行し、このコマンドの出力から読み取ることを意味します。今
open (COMMAND, "java -jar foo.war|") or die "Can't execute 'java -jar foo.war'";
、私はコマンドjava -jar foo.war
を実行しているし、私のPerlスクリプトで、その出力を使用しています。このようなものを想像してみてください。
あなたはあまりにも周りにこれに他の方法を行うことができます。私は今、コマンドmail $recipient
を開き、print
文でそれを書いている
open (MAIL, "|mail $recipient") or die "Can't mail $recipient";
print MAIL "Dear $recipient\n\n";
print MAIL "I hope everything is well.\n";
print MAIL "Sincerely,\n\nDavid";
close MAIL;
。この場合、私は$recipient
に簡単なメッセージで電子メールを送ります。
私はs/^ \ s + //とは分かりません。のために使用される?元のプログラムで
、それは単独行にあった:
s/^\s+//;
私はそれを少し明確に役立つはず変数を逃すを追加しました:
$_ =~ s/^\s+//;
これはPerlの代替コマンドです。 $_
という変数を使用し、正規表現^\s+
を何も入力しません。正規表現の内容がわからない場合は、対象のPerldoc tutorialをご覧ください。基本的には、空白、タブ、および他の形式の空白が行の先頭から削除されています。
このコードはかなり奇妙です...最初のs/^ \ s + //;まったく何もしていないように見えます。実際、私はそれがエラーを投げると思うでしょう... || ORを表す。と|私は(私が間違っている可能性があるので、iveがperlを使用しているのでしばらくしていたと思う)とは単に開かれているファイルを解読することを意味します。私は素早くgoogle検索を行った。http://www.rocketaware.com/perl/perlfunc/open.htm – Justin
@Justin: 's ///'はデフォルトの引数( '$ _')で動作しているので引数なしの 'split'呼び出しは同じことをしており、while()は' $ _'に代入します。 –
また、 ":"は正規表現では特別なものではないので、 "\" – runrig