• ベストアンサー

Perlの書き方について

perlを勉強していて、似たような配列やハッシュの場合でしたらなんとか解決出来たのですが、以下の場合が思うような結果が得られず困っているので、どなたか教えていただきたく質問しました。 例) my $hoge1=10; my $hoge2=9; my $hoge3=8; my $hoge4=7; my $hoge5=6; my $hogehoge; for(1..5){ $hogehoge+=$hoge$_; } 上記の書き方の場合、「$hoge$_」でエラーが出ます。 このような場合は、どのように書けばいいのでしょうか。 よろしくお願いします。

  • hana43
  • お礼率49% (105/212)
  • Perl
  • 回答数3
  • ありがとう数11

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

> 「$hoge$_」のような書き方は出来ないのでしょうか。 似たようなことをやる方法はありますが、その書き方は推奨されていないと思います。 実行中のプログラムの変数を文字列だと思い、実行中のプログラム中の変数と連結してその値を得るには一つメタな立場にあがらないといけません。例えるなら、プログラムを実行している視点から、プログラムを書いている視点にあがるとも言えるかもしれません。多くのスクリプト言語にはそれをするためにevalという命令が用意してあります。 ただ、evalはそこに書かれている文字をプログラムだと思って愚直に実行するので、そこに書かれる文字を完全に制御できないと非常に危険です。よって、まともな人ならevalを実用するプログラムには使いません。なお、perlのevalには環境を分けるなど別の使い方もあります。詳しくはこれを御覧ください。 http://www.effectiveperlprogramming.com/2011/03/know-the-different-evals/ 一応、evalを使った書き方です。 $hogehoge+=eval('$hoge' . $_);

hana43
質問者

お礼

丁寧に教えていただきありがとうございます。 evalについて、このような使い方があったとは知らず、参考URLも拝見させていただきました。 やはり、配列などを使ってのやり方が一番使いやすいようなので、そちらでやってみたいと思います。 ありがとうございました。

その他の回答 (2)

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.3

$hogehoge += eval("\$hoge$_"); 通常のコードで使うのはお勧めできませんが、上記のようにすればエラーなく動くようになります。

回答No.1

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[$_]; }

hana43
質問者

補足

早速ありがとうございます。 やはり、今回の場合は配列を使うしかないのですかね。 「$hoge$_」のような書き方は出来ないのでしょうか。

関連するQ&A

  • perlの比較、ループの使い方について質問です。

    perlの比較、ループの使い方について質問です。 perlの初心者でperlを使っていろいろと勉強しているのですが、以下のような場合、簡単に書ける方法ってないでしょうか? 比較、ループなど調べてみたのですが、なかなか思うようにいきません。 よろしくお願いします。 なお、以下のスクリプトではエラーが出て動きませんが、その点は今回の説明の為ご了承願います。 my @hoge(1,10,100,1000,10000,100000,1000000); my $no=☆ ←☆については1~5の間でランダムに設定します。 my(@test); for (my $i=0; $i<$no; $i++) { @test[$i]=@hoge[$i]; } 例えば$noが2の場合、@test[0]と@test[1]を比較(@test[0]<@test[1])して偽の場合は、エラーを出し、$noが3の場合、@test[0]と@test[1]と@test[2]を比較(@test[0]<@test[1]<@test[2])して偽の場合は、エラーを出し、$noが4の場合、@test[0]と@test[1]と@test[2]と@test[3]を比較(@test[0]<@test[1]<@test[2]<@test[3])して偽の場合は、エラーを出し……以下同じような感じで進めたいのですが、簡単な書き方ってないでしょうか? if ($no==2){ unlss (@test[0]<@test[1]){エラー} }elsif($no==3){ unless (@test[0]<@test[1]<@test[2]){エラー} }elsif($no==4){ unless (@test[0]<@test[1]<@test[2]<@test[3]){エラー} } 上記のような書き方となるかと思いますが、$noが2の場合、test配列に@test[2]と@test[3]が変数としてない為上記の書き方ではスクリプト自体エラーとなります。 説明が分かりにくい点については申し訳ありませんが、どなたかご教授願えないでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • perlのrequreの設定

    perlでCGIを書いていますが、一部のhoge.pmは別のサーバーに置いてあります。その場合一部のhoge.pmを別のサーバーから読み込むことは可能ですか? require 'https://www.hoge.co.jp/home/hogehoge/hoge.pm' にすると’can't locate'のエラーになります。どのようにしたら良いのでしょう? perlを始めたばかりで知識がありません。よろしくお願いします。

    • ベストアンサー
    • Perl
  • perl ハッシュ エラー

    現在perlの勉強中で、ハッシュの項目まできました。しかし、use strictにするとこのコードがエラーになります。 #!/usr/bin/perl use strict; use warnings; print "Content-type:text/html\n\n"; $hoge{"key1"} = "value1"; print $hoge{"key1"}; exit; ヴァージョンは5.8.9です。use strictをコメントアウトすればエラーはでません。どうしてエラーになってしまうのでしょうか?どうすればエラーを出さずに表示することができるのでしょうか?どうかご教授ください。よろしくお願いします。

    • ベストアンサー
    • Perl
  • Perlで特定行から特定行までを抜き出したい

    皆さんのお知恵をお貸し頂ければ幸いです。 Perlで以下のようなことをしたいと考えています。 例えば、次のようなテキストファイルがあったとします。 example.log ================================== aaaa hogehoge test okok perl script ================================== 上記ファイルを読み込んで、「hogehoge」から「perl」の間に挟まれた行だけ抜き出したいのです。 イメージとしては、読み込んだファイルを配列に入れて、一行づつ読ませ、キーワード「hogehoge」が現れたらそこでフラグを立て、それ以降の行を表示し、キーワード「perl」が現れた時点で表示を止めるという処理になるのかな?と思っています。 このような場合、どういう風にすればいいのでしょうか? 恐れ入りますが、ご教授頂ければ幸いです。 それでは、どうぞよろしくお願い致します。

    • ベストアンサー
    • Perl
  • perlのeach関数の動き?

    perl5.8ですがeach関数を使って何回か動かすと、ハッシュ内にあるはずのデータが取得できなくなります。 my %hash = ('a'=>100, 'b'=>50); for(1..100){ while( my ($k, $v) = each %hash ){ if($k eq 'a'){ ... 通過しなくなる。 } } } PHPでは、配列に対してですが、reset関数というものがありますが perlでは、何か対策でもあるのでしょうか? 現在は、keys関数で代用しています。 eachでループは無理なのでしょうか?

    • ベストアンサー
    • Perl
  • perl 配列名変数指定するには

    perlプログラムで for文で ループ分の配列定義するには どうしたらよいですか? 下記のようなことができないかと 考えております。 for(my $i = 0; $i < $file_no; $i++){ my @{"segments$i"} =(); #配列定義 my ${"line$i"}="";     #変数定義 my %{"hash$i"}= ();    #ハッシュ定義 open(ARG1,$ARGV[$i]); while(<ARG1>){ ${'line'.$i} = $_; chomp ${'line'.$i}; @{'segments'.$i} = split(/\t/,${'line'.$i});        ${'hash'.$i}{${'segments'.$i}[0]}=${'segments'.$i}[1];     } close(ARG1); } #下記で、その後 各ハッシュに設定したデータをもとに いろいろ計算したい foreach my $a (keys %{'hash'.$i}){ ・・・ } 今は、Can't declare array dereference in "my" at test.pl line XX, near "} =" と 配列定義でエラーとなり処理できません。

    • ベストアンサー
    • Perl
  • Perlのデータ構造について

    Perlのデータ構造でわからないところがあります。 ハッシュの配列で、以下の構造がある場合 my %hash_array = ( 1=>["aaa", "bbb"], 2=>["ccc", "ddd", "eee"], 3=>[], 4=>["fff"] ); print $hash_array{1}[0]; # aaaが表示される。 print $hash_array{2}[2]; # eeeが表示される。 ですが、 $hash_array{1}は 2 $hash_array{2}は 3 $hash_array{3}は 0 $hash_array{4}は 1 のように個数を表示させるのは、どうすればよいでしょうか? Perlのデータ構造に詳しいサイトや書籍はありますか? また、Perl 5.6.1から Perl 5.8.7に乗りかえようとしていますが、 データ構造など大幅に変わった点はあるのでしょうか?

    • ベストアンサー
    • Perl
  • perlとphpの共用?

    phpで定義した関数をperlから読み込む、又はその逆をしたいのですが 可能なのでしょうか? たとえばphpの関数をperlが読む場合? phpスクリプト <? $hoge = 'hoge1'; ?> となっていた場合にperlで読む場合にはどうすればいいでしょうか? 又上記の場合が可能である場合に $hoge を const HOGE = 'hode1'; とした場合でも可能なのでしょうか?

    • ベストアンサー
    • PHP
  • Perlのコードを隠蔽する

    Perlのソースコードを隠蔽する&ActivePerlなどがない環境でも動くようにperl2exeを使って変換して配布しようと思っています。 逆コンパイラされる可能性が0ではないことはわかっています。 しかし、下記コードの実行がなかなかうまくいきません。実際の.plでの起動時ではうまくいくのですが、.exeに変換するとうまくいかないようです。回避方法を教えてください。 -------------------- use HTTP::Request::Common qw(POST); use LWP::UserAgent; my $ua = LWP::UserAgent->new; my %loginform = ('mail' => 'hogehoge@hoge.jp', 'password' => 'hogehoge'); my $request = POST('https://****/login', [%loginform]); my $res = $ua->request($request); my $cookie = $res->header('Set-Cookie'); --------------------

  • perl cgiでnameを

    perl cgiでフォームの行と列を以下のようにハッシュと配列を使って生成しようとしました: my %temp = ( 'test1' => 'テスト1', 'test2' => 'テスト2' ) for (my $linepnt = 1; $linepnt<8; $linepnt++){ foreach my $key (keys(%temp)){ print "<td><input type=\"text\" name=\"$key . '_' . $linepnt\" value=\"$in_data{$key . '_' . $linepnt}\" style=\"width:3em;font-size:medium\">mL</td>"; } } するとフォームからの入力を受けた側ではnameを test1_7 というように受け取らずに test1+.+%27_%27+.+7 と受け取っていることが分かりました。 name=\'test1_' . $linepnt\"  とするだけなら正しく test1_7  として受け取ってくれます。 なにが間違っているのでしょうか。 ご指導ください。

    • ベストアンサー
    • CGI

専門家に質問してみよう