なぜ、このマップは、単一の番号を返すのですか?
-
22-09-2019 - |
質問
私が使用していたコードの行数を削減しようとしていますが、(私はちょうど参照の周りに私の頭をラップし始めておりますので、それは私に遊説だが)かなり単純な問題で終わるのです。
私はこのように...特定の順序で複数の値を連結するために私のコードのルックスをしようとしています..
my $separator = ":";
my @vals = qw(name last-name first-name phone);
my $return_name;
$return_name = map {
$return_name = $return_name . $query->param($_) . $separator
} @vals;
私は何を取得していますが代わりに、1つの文字列にすべてをconcantenatingの、「4」である。
私が達成しようとしていますどのような...
の短いバージョンです$return_name = $query->param('name') .
$separator . $query->param('last-name') .
$separator . $query->param('first_name') .
$separator . $query->param('phone');
(私は実際には25 $query->params
について一緒に文字列にしようとしている。私は簡潔にするために4を与えた)。
解決
あなたの問題の一部がどのようにmap
作品以上の混乱である。
map
は、引数のリストを取り、リストの要素に対して演算を行い、その結果から新しいリストを作成します。スカラコンテキストでは、新しいリストのメンバー数を返します。
ほとんどの場合、あなたはmap
操作での割り当てを行うにはしたくない。
# no assignment needed to set @foo
my @foo = map $_+2, 1,2,3;
# @foo = (3,4,5);
割り当てが理にかなっている一つの場所は、あなたが通常$_
の値を変更します操作を使用する必要がありますが、そのままマッピングするために、引数を保持する必要がある場合です。
という説明がひどく明確ではありません。これらの例をチェックアウト、彼らは私が言っているものを明確に役立つはずです。あなたはそれを処理した値を変更することができマップ最初のショーます:
my @foo = qw( fee fie foe fum );
my @bar = map { s/e/-/g } @foo;
# @foo = ( 'f--', 'fi-', 'fo-', 'fum' );
# @bar = ( 2, 1, 1, '' );
あなたが行うことができます@fooを変更することを避けるために:
my @foo = qw( fee fie foe fum );
my @bar = map { my $val = $_; $val =~ s/e/-/g } @foo;
# @foo = ( 'fee', 'fie', 'foe', 'fum' );
# @bar = ( 'f--', 'fi-', 'fo-', 'fum' );
それともあなたが行うことができます:
ユースリスト:: MoreUtils QW(適用);
my @foo = qw( fee fie foe fum );
my @bar = apply { s/e/-/g } @foo;
# @foo = ( 'fee', 'fie', 'foe', 'fum' );
# @bar = ( 'f--', 'fi-', 'fo-', 'fum' );
map
ループの特殊な形態のような最も基本的なfor
作品で。コードの2つのチャンクが全く同じ結果を生成
my @foo = map {$_ * 2} 1..5;
my @bar;
for (1..5) {
my $val = $_ * 2;
push @bar, $val;
}
私は、これはmap
考える方法を学ぶにはあなたにいくつかの助けを与えている願っています。あなたは簡潔通常のループコードを使用して構築することができます信じられないほど詳細な考えを表現することができるようになりますそれ(とgrep
とapply
などの関連構造)を使用することを学んだしたらます。
他のヒント
$return_name = map { $return_name = $return_name . $query->param($_) . $separator } @vals;
マップ操作スカラコンテキストを与えるスカラー割り当て、です。 スカラコンテキストでマップには、生成されたであろう要素の数を返します。
コードの特定の行には、参加()するの使用のために叫ぶもののあなたは関数型プログラミングの背景から来ている場合、あなたは減らすとより快適かもしれます:
use List::Util 'reduce';
$return_name = reduce { $a . $query->param($b) . $separator } "", @vals;
map
は、リストではなく、文字列を返します。これを試してください:
$return_name = join $separator, map { $query->param($_) } @vals;
あなたが本当に行数を削減したい場合は、これを試してみるか:
my $return_name = join ':',
map { $query->param($_) }
qw(name last-name first-name phone);
(1行のバージョンは、DSMの答えに触発されました。)
これを試してみてください
join $separator,
map { $query->param($_) }
("name", "last-name", "first-name", "phone");
あなたが「4」を取得する理由を答えるために、あなたはスカラーに結果の配列カーディナリティを割り当てているので、それがある。
あなたが受け取ったすべての良い答え、ノートに加えている。
$return_name = $return_name . $query->param($_) . $separator;
のように記述することができます
$return_name .= $query->param($_) . $separator;