デフォルト値

back
Perl には $_, @_, @ARGV などのデフォルト値があり、
組み込み関数の引数を省略した場合などに、自動で引数として
使われる値がある。

逆に言うと、組み込み関数の引数を省略した場合、そのいくつかは、
デフォルトの引数として、$_, @_, @ARGV を引数とする。

スカラーを引数とするものの中には、$_ をデフォルトの引数とする。

print;                   # print $_; と同じ
split(/PATTERN/);        # split(/PATTERN/, $_); と同じ
if (/^foo/)              # if ($_ =~ /^foo/) と同じ
s/PATTERN/replace/       # $_ =~ s/PATTERN/replace/ と同じ

配列を引数とするもの中には、main パッケージ内では @ARGV を、
サブルーチンでは @_ をデフォルトの引数とする。

$val = shift;            # main では $val = shift @ARGV
                         # サブルーチンでは $val = shift @_;

デフォルト値に値がセットされる状況は、配列は主に
@ARGV:  コマンドライン引数
@_:     サブルーチン呼び出し時引数
がよく使われる。

スカラーについては、主にループブロックのデフォルト値としてセットされる。

foreach (@array) {
  # ループのたびに @array から一つずつ $_ にセットされる
  # $_ に対する処理
}
は
foreach $_ (@array) {
  # 処理
}
と同じ


while (<FH>) {
  # ループのたびに、FH から1行ずつ $_ にセットされる
  # $_ に対する処理
}
は
while ($_ = <FH>) {
  # 処理
}
と同じ


一般にデフォルト値の使用は、見にくくなりがちといわれるが、状況次第(だと思う)

open(F, "/etc/apache/httpd.conf");
while(<F>){
  print if (!/\s*\#/);
}
close(F);


open(F, "/etc/apache/httpd.conf");
while($line = <F>){
  if ($line !~ /\s*\#/) {
    print $line;
  }
}
close(F);

back