配列に含まれる各単一の文字列を指定せずに、perlで文字列変数の配列を作成することは可能ですか?文字と数字に「..」ショートカットを使用するようなものです。
例えば:
$v1 = "hey";
$v2 = "hello";
$v3 = "bye";
$v4 = "welcome";
@f = ("$v1" .. "$v4");
$f[2]を出力するように; 「さようなら」に等しいだろう...
私はこのアプローチにわくわくしていませんが、あなたはこれを行うことができます:
$v1 = "hey";
$v2 = "hello";
$v3 = "bye";
$v4 = "welcome";
@f = map{eval "\$v$_"}1..4;
それはあなたが意味することですか?
my @v = qw/hey hello bye welcome/;
print join "\n", @v;
これARRAY
が作成されると、次のアイテムにアクセスできます。
print $v[0];
ここで、 :hey0
のインデックスはここにあります。ARRAY
evalを使用してこれを行うためのプロシージャを作成できると思いますが、そもそもなぜ$ v1、$v2を使用するのでしょうか。配列から始めてみませんか?
または、実際に何をする必要があるかに応じて、次のようなものを使用します
@f = qw(hey hello bye welcome);
これは、を使用して解決できる可能性がありますが、おそらく解決すべきではありませんno strict 'refs'
。そして偶然にもno strict 'vars'
:
use strict;
use warnings;
use Data::Dumper;
{
no strict 'vars';
$v1 = "hey";
$v2 = "hello";
$v3 = "bye";
$v4 = "welcome";
no strict 'refs';
my @f = map ${'v'.$_},1..4;
print Dumper \@f;
}
出力:(警告なし)
$VAR1 = [
'hey',
'hello',
'bye',
'welcome'
];
実際に参照する必要no strict 'vars'
のある変数は(実際には)名前が付けられて$main::v1
いるなどの理由で必要ですno strict 'vars'
。完全な指定を使用することで、実際に必要性を回避できます。また、strictをまったく使用していない場合、これは問題ではありません。使用しないことstrict
は、警告ランプにステッカーを貼って車のエンジンの問題を解決するのと同じくらい賢いですが、エンジンの故障を防ぐことはできません。
あなたはそれをすべきですか?しそうにない。それを回避する方法は常にあります。しかし、あなたがこのような不正行為で船外に出ないことを前提として、このようにすることはひどく間違っていません。
適切な方法は、、...を使用する代わりに、、$v1
...$v1000
を使用すること$v[0]
です$v[1000]
。つまり、値をすぐに配列に割り当てます。