5

このコードは、パスのセット内の一意のベース名スタブのハッシュキーを使用してセットをコンパイルします。

%stubs = map { $f=basename $_; $f =~ /^([A-Za-z]+[0-9]+)\./ ; $1=>() } @pathlist;

$fここで参照が必要なのはなぜですか?私は大丈夫だと思った:

%stubs = map { basename; /^([A-Za-z]+[0-9]+)\./; $1=>() } @pathlist;

しかし、私は一致しません。マップブロックの$_を変更することは許可されていませんか?



コードが何をしているのか疑問に思っている人のために:

$ path(@pathlist)ごとに、ベース名を取得し、最初の文字と数字のシーケンスに一致してから、空のリスト値のキーとして最初の角かっこ一致を返します。例:

/some/dir/foo123.adfjijoijb
/some/dir/foo123.oibhobihe
/some/dir/bar789.popjpoj

戻り値

foo123 => ()
bar789 => ()

その後、マップのキーを値のセットとして使用するので、処理します。

4

3 に答える 3

13

basename は、デフォルトでは に作用しません$_。ただし、$f を使用する代わりに、その戻り値と照合できます。

%stubs = map { basename($_) =~ /^([A-Za-z]+[0-9]+)\./; $1 => undef } @pathlist;

リスト内の () は要素を生成しないことに注意してください。undef だけであっても、値を指定する必要があります。を使用$1 => ()すると、マップの反復によって、%stubs のキーと値が交互に生成されます。

$1 を使用する前に、正規表現が成功することを常に確認することをお勧めします。

%stubs = map { basename($_) =~ /^([A-Za-z]+[0-9]+)\./ ? ($1 => undef) : () } @pathlist;

ただし、ハッシュ値が undef ではなく空の文字列であることを気にしない場合は、正規表現の一致を目的のリストに戻すことができます。

%stubs = map { basename($_) =~ /^([A-Za-z]+[0-9]+)()\./ } @pathlist;
于 2011-05-19T08:02:40.230 に答える
6

map と grep では、$_ は配列内の値のエイリアスです。それらを変更すると、実際には配列内の値が変更されます。これはおそらくあなたが望むものではなく、おそらく何が間違っているのでしょうが、どちらの場合も印刷キー %stubs と @pathlist を後でデバッグし、それが何を言っているのかを私たちに知らせてください.

また: File::Basename の basename は暗黙的に $_ で動作しません。それは私のためにエラーを生成します。

#!/usr/bin/perl
use feature say;
use File::Basename;

@pathlist=("/some/dir/foo123.adfjijoijb","/some/dir/foo123.oibhobihe","/some/dir/bar789.popjpoj");
%stubs1 = map { $f=basename $_; $f =~ /^([A-Za-z]+[0-9]+)\./ ; $1=>() } @pathlist;
say join(',',keys %stubs1);
say "---";
say join(',',@pathlist);
say "---";

%stubs = map { $_=basename $_; /^([A-Za-z]+[0-9]+)\./; $1=>() } @pathlist;
say join(',',keys %stubs);
say "---";
say join(',',@pathlist);
say "---";

%stubs = map {basename; /^([A-Za-z]+[0-9]+)\./; $1=>() } @pathlist;
于 2011-05-19T07:24:29.153 に答える
0

代替実装:

my %stubs =
   map { $_ => undef }
   map { basename($_) =~ /^([A-Za-z]+[0-9]+)\./ }
   @pathlist;
于 2011-05-19T16:46:34.020 に答える