プロが教える店舗&オフィスのセキュリティ対策術

perlを勉強していて、似たような配列やハッシュの場合でしたらなんとか解決出来たのですが、以下の場合が思うような結果が得られず困っているので、どなたか教えていただきたく質問しました。

例)

my $hoge1=10;
my $hoge2=9;
my $hoge3=8;
my $hoge4=7;
my $hoge5=6;

my $hogehoge;
for(1..5){
$hogehoge+=$hoge$_;
}


上記の書き方の場合、「$hoge$_」でエラーが出ます。

このような場合は、どのように書けばいいのでしょうか。

よろしくお願いします。

A 回答 (3件)

> 「$hoge$_」のような書き方は出来ないのでしょうか。



似たようなことをやる方法はありますが、その書き方は推奨されていないと思います。

実行中のプログラムの変数を文字列だと思い、実行中のプログラム中の変数と連結してその値を得るには一つメタな立場にあがらないといけません。例えるなら、プログラムを実行している視点から、プログラムを書いている視点にあがるとも言えるかもしれません。多くのスクリプト言語にはそれをするためにevalという命令が用意してあります。

ただ、evalはそこに書かれている文字をプログラムだと思って愚直に実行するので、そこに書かれる文字を完全に制御できないと非常に危険です。よって、まともな人ならevalを実用するプログラムには使いません。なお、perlのevalには環境を分けるなど別の使い方もあります。詳しくはこれを御覧ください。
http://www.effectiveperlprogramming.com/2011/03/ …

一応、evalを使った書き方です。
$hogehoge+=eval('$hoge' . $_);
    • good
    • 0
この回答へのお礼

丁寧に教えていただきありがとうございます。

evalについて、このような使い方があったとは知らず、参考URLも拝見させていただきました。

やはり、配列などを使ってのやり方が一番使いやすいようなので、そちらでやってみたいと思います。

ありがとうございました。

お礼日時:2014/07/30 21:51

$hogehoge += eval("\$hoge$_");



通常のコードで使うのはお勧めできませんが、上記のようにすればエラーなく動くようになります。
    • good
    • 0

my @hoge;


$hoge[1]=10;
$hoge[2]=9;
$hoge[3]=8;
$hoge[4]=7;
$hoge[5]=6;

my $hogehoge = 0;
for(1..5){
$hogehoge+=$hoge[$_];
}

この回答への補足

早速ありがとうございます。

やはり、今回の場合は配列を使うしかないのですかね。


「$hoge$_」のような書き方は出来ないのでしょうか。

補足日時:2014/07/30 20:08
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!