【perl】配列からプレースホルダを作る

いい加減perlにも慣れてきたんで、
そろそろmapとかgrepとかバリバリ使いこなして
ソースのスピード化を推進していきたいと思う今日この頃。

とりあえず、今日は効率のいいプレースホルダの作り方について。

たとえば、

my @arr = (foo1 foo2 foo3);

から

INSET INTO TABLE(col1 col2 col3)VALUES(?,?,?);

のようなSQLのプレースフォルダを作る場合。

今まで。。。

my $param ='';
foreach my $val (@arr) {
$param .= '?,';
}
chop $param;


今日は

return substr('?,' x @arr, 0, -1);


でやってみた。

かなりシンプルだし、早くなった気がする。

けど、ソースの意味がわからん。
(出所 -> 配列から効率良くプレースホルダを作る

substr はなんとかわかるけど、x ってなに?
どっかで見たことあるような気がする。
でもどんな演算しだったかいまいちわからない。
で、調べた。


やっぱり、ポイントは「x」だった。
「x」 は 「String repetition operator」というもので、
文字列繰り返し演算子(?)というものらしい。
(Learning Perlより)

'?,' x @arr

という文脈の場合
'?,'を@arrの個数分繰り返すという意味らしい。

なるほど。
それでsubstrで最後の余分な','を取り除いて完了ってわけですな。