• ベストアンサー

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
  • 回答数2
  • ありがとう数8

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

1. あらかじめ my %hoge; ないし our %hoge; としておく. 2. use vars '%hoge'; を使う. 「納得できない」といわれても, 「無い袖は振れない」わけでして.... my にしろ our にしろ, ハッシュならハッシュ全体が対象になります. だから, 一部のみにアクセスする $hoge{"key1"} = "value1"; という形では my も our もつけられないんです.

3104kita
質問者

お礼

理由がわかれば納得できます。$hoge{"key1"} = "value1";という形ではやりようがないのですね。どうもありがとうございました!

その他の回答 (1)

  • taporu
  • ベストアンサー率44% (46/104)
回答No.1

use strict;は最初に変数や配列の宣言をしなければなりません。 最初に、my %hoge;や、local %hoge;などで宣言してください。

3104kita
質問者

補足

%hoge = ("key1","value1"); のような書き方ではなく、 $hoge{"key1"} = "value1"; の書き方ではどうすればいいのかを知りたいです。 ちなみに、my %hoge = ("key1","value1");であれば表示できましたが、local %hoge = ("key1","value1");ではエラーになりました。 勉強なので、my %hogeで表示できるからいっか!っていうのは納得がいきません。$hoge{"key1"}のような書き方で表示する方法を教えてください。よろしくお願いします。

関連するQ&A

  • Perlで use strict して our変数

    Perl 初心者です。初めて質問します。 test_sub.pl で宣言した変数を test_main.pl から参照したくて悩んでいます。 環境 : WindowsXP / ActivePerl 5.14.2 -------------------- * test_sub.pl -------------------- #!/usr/bin/perl use strict; our $hoge = 'HOGE'; 1; -------------------- * test_main.pl -------------------- #!/usr/bin/perl use strict; require 'test_sub.pl'; print "Content-type: text/html\n\n"; print $hoge; -------------------- これを実行すると、 Global symbol "$hoge" requires explicit package name at C:/public_html/cgi-bin/test_main.pl line 7.\r というエラーが出ます。 require する前に、test_main.pl のほうで our($hoge); と宣言したり 参照する際に print $main::hoge; とパッケージを指定したりすればいけるのですが、 これらをしないとできないものなのでしょうか。 use strict; を書かなければ最初のソースでも動くのですが use strict は書きたい… 継承のようなことをしたいのです。 ちなみに以下試してみたソースです。 -------------------- * test_main.pl -------------------- #!/usr/bin/perl ######################################## # NG use strict; require 'test_sub.pl'; print "Content-type: text/html\n\n"; print $hoge; ######################################## # OK our変数を宣言しておくといける =pod use strict; our ($hoge); require 'test_sub.pl'; print "Content-type: text/html\n\n"; print $hoge; =cut ######################################## # OK 参照する際にパッケージ名を指定すればいける =pod use strict; require 'test_sub.pl'; print "Content-type: text/html\n\n"; print $main::hoge; =cut ######################################## ######################################## # NG =pod use strict; use base qw(test_sub); print "Content-type: text/html\n\n"; print $hoge; =cut ######################################## -------------------- * test_sub.pm -------------------- #!/usr/bin/perl package test_sub; use strict; our $hoge = 'HOGE'; 1; -------------------- NG パタンはどちらも Global symbol "$hoge" requires explicit package name のエラーとなります。 もしご存じの方がいらっしゃいましたら教えてください。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • SSIの表示

    perl/cgiの勉強中でssiでhtmlへの埋め込みを行いたいのですが、何故か出力が2度されてしまいます。 以下実行プログラムと結果です。 [test.cgi] #!/usr/bin/perl -w use strict; use warnings; print "Content-type:text/html\n\n"; print "hoge"; exit; [test.shtml] <html> <head></head> <body> <!--#include virtual="/cgi-bin/test.cgi"--> </body> </html> [出力] hogehoge …となってしまいます。どなたかご教示願えませんでしょうか? よろしくお願いいたします。

    • 締切済み
    • CGI
  • use strictが効かない (PERL)

    たびたびお世話になっております。 PERL version 5.14.2 をWindows 7 のコマンドプロンプトから起動して使っています。 use strict; と一行目に書くと 宣言されていない変数があれば拒絶されるとのことで #!/usr/bin/perl use strict; use warnings; $a = 10; print "$a\n"; というスクリプトを書きました。が、すんなり動いてしまいます。 use strict; は どうすればうまく効くのでしょうか。 ご指導お願いします。

    • ベストアンサー
    • Perl
  • perlで配列名を動的に作り出したい

    試しに次のようにしてみましたがエラーになりました。 #!/usr/local/bin/perl use strict; use warnings; my $mystr = "abcde"; my @{$mystr} = (1,2,3); $mystrの内容はいろい変わっていきます。 ご存知の方いらっしゃいましたらすみませんが教えてください。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • Perl 正規表現について

    Perlに関していつもお世話になっております。 今回も正規表現に関する質問をしたいと思います。 「あ、あい、あいう、あいうえ、あいうえお」というハッシュが存在するときに、「{あ}は○○回出ました。」「{あい}は○○回出ました。」とそれぞれ表示させるコードを組もうと思います。 前回までで皆様に教えていただいたことを元に組んでみました。 #!/usr/bin/perl use warnings; use strict; use utf8; use Encode; my %word_of = ( 'あい' => 0, 'あいう' => 0, 'あいうえ' => 0, 'あいうえお' => 0, 'かき' => 0, 'かきく' => 0, 'かきくけ' => 0, 'かきくけこ' => 0, ); foreach my $search_key ( keys %word_of ) { foreach my $word ( keys %word_of ) { if ( $word =~ /$search_key/ ) { $word_of{$search_key}++; } } } foreach my $key ( sort ( keys %word_of ) ) { # utf8, shiftjis eucjp ... print encode( 'utf8', "「$key」 は $word_of{$key} 回出ました" ), "\n"; } これを出来ればeucjpで組みたいのですが、可能でしょうか? 私の思いあたる点、utf8表記の部分をeucjpに直しただけではエラーが出てしまいます。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • Perl の use strict に付いて

    ●HTML <html><head> <meta http-equiv="content-type" content="text/html;charset=UTF-8" /> <title>テスト5(UTF-8)</title> </head> <body> <form action="test5.cgi" method="post" > <input type="text" name="f1" value="" size="80"> <button type="submit" >送信</button> </form> </body></html> —————————————————————————————————————— ●Perl #!/usr/bin/perl #use strict; ※問題の行1 use warnings; use CGI; print "Content-type: text/html\n\n"; print "<meta charset=\"UTF-8\">\n"; # POST / GET パラメータを取得------------------------- my $q = new CGI; # パラメータ名を指定して取得する my $param1 = $q->param('name1'); my $param2 = $q->param('name2'); # FORM値の取得----------------------------------- # 全てのパラメータを取得する for my $param_name ($q->param) { print $param_name . ' = ' . $q->param($param_name) ; print "<br>\n"; ${$param_name} = $q->param($param_name); ※問題の行2 } #------------------------------------------------- print "テスト<hr>\n"; print "$f1<br>\n"; exit; —————————————————————————————————————— 【質問】 「※問題の行1」+「※問題の行2」 = エラー 「※問題の行1」のみ = 正常に動きます 「※問題の行2」のみ = 正常に動きます 「※問題の行1」の「use strict; 」と 「※問題の行2」の「${$param_name} = $q->param($param_name); 」 をどう書き換えれば、二つとも記述したまま正常に動くのでしょうか? よろしくお願いします。

    • ベストアンサー
    • Perl
  • 「Perl」ハッシュの使い方について

    Perlのハッシュで気軽に多次元配列のようなことをしたいのですができますか? (下記のコードで一応動きましたが、本当にこういった機能があるのか自信がもてません。) もし、可能である場合、 $fruits{'apple'}{'甘い'} = "リンゴ"; $fruits{'melon'}{'甘い'} = "メロン"; 以外の代入方法があれば教えてください。 また、 print values %$fruits; が表示されません。 表示させる方法はありますか? 以上、ご存知の方、居られましたらぜひ教えてください。 宜しくお願い致します。 -test.cgi----------------------------------------- print "Content-Type: text/plain\n\n"; $fruits{'apple'}{'甘い'} = "リンゴ"; $fruits{'melon'}{'甘い'} = "メロン"; print '結果:'.$fruits{'apple'}{'甘い'}; print "\n"; print '結果:'.$fruits{'melon'}{'甘い'}; print "\n"; print keys %fruits; print values %$fruits;# <<表示されない exit; -----------------------------------------

    • ベストアンサー
    • CGI
  • PerlでZipファイルを作りたい

    PerlでZipファイルを作りたいのですが上手くいきません。 実行すると「Internal Server Error」になります。 Perlのバージョン:5.008009 文字コードは、Shift_JIS 改行コードは、Unix(LF)、です。 サーバーは「さくら」です。(ドリームホストも試しましたがダメでした) ファイル構成は zip.cgi data.txt 同じ階層に置いてます。 こちら https://www.h-fj.com/blog/archives/2010/07/19-203224.php のサイトを参考にさせてもらって下のように作ったのですが・・・ (print "Content-type: text/html¥n¥n";)は自分で勝手に 「いるんじゃない?」と思って付け加えました。 私、どこが間違っているのでしょうか? よろしくお願いします。 ———————————————————————————— zip.cgi ———————————————————————————— #!/usr/bin/perl use strict; use Archive::Zip qw( :ERROR_CODES :CONSTANTS ); my $zip = Archive::Zip->new(); # Zipのオブジェクト作成 $zip->addFile('data.txt'); # ファイルを圧縮 # Zipファイルに保存する print "Content-type: text/html¥n¥n"; if ($zip->writeToFileNamed('test.zip') == AZ_OK) { print "test.zip is successfully saved.¥n"; } else { print "test.zip save error.¥n"; } exit;

    • ベストアンサー
    • CGI
  • PerlでHTTPヘッダの\nを外すとエラー

    【PerlでHTTPヘッダの最後の\nを1つでも外すとエラーになります】 初歩的なことですみません。 HTTPヘッダーの最後の\n\nなんですが、ヘッダーの文字列の後に改行が2つ?? と思って この\nを外して、 print "content-type:text/html;charset=utf-8"; とすると、「500 Internal Server Error」 print "content-type:text/html;charset=utf-8\n"; と\nが1つでも 「500 Internal Server Error」 となります。 「\n\n」と2つあればエラーにはならないんですが、なぜ必ず2つ必要なのでしょうか?これは改行が2つって意味ですかね? print "<html>\n"などの\nはソース上やコンソール出力結果上での改行なのはわかります。 この\nは改行したくなければ書かなくてもエラーになりませんよね。(当たり前ですが・・ #!/usr/bin/perl print "content-type:text/html;charset=utf-8\n\n"; ←HTTPヘッダーの\n\n print "<html>\n"; print "<body>\n"; print "<p>テキスト</p>\n"; print "</body>\n"; print "</html>\n";

    • ベストアンサー
    • Perl
  • perl で環境変数を表示できない

    perlの初心者です。下記のCGIを実行しましたが、全く表示しません。 最初の「環境変数」と言う文字も表示しません。 どこか初歩的なエラーがあると思いますが、わかりませんので質問させていただきます。 --- #!/usr/local/bin/perl print "Content-type: text/html", "\n\n"; print "<HTML><BODY>", "\n"; print "<H1>環境変数</H1><HR>", "\n"; foreach my $key( keys %ENV ){ print "$key: $ENV{$key}<BR>", "\n"; } print "<HR>", "\n"; print "</BODY></HTML>", "\n";

    • ベストアンサー
    • Perl