%stderr%の値が何をさしているのか

このQ&Aのポイント
  • Perlを動かしたら、標準エラーが返ってきました。具体的には、Bareword "FH" not allowed while "strict subs" in use at C:/Apache Group/Apache2/cgi-bin/cgi.cgi line 1000.というエラーメッセージです。
  • このエラーメッセージは、PerlのプログラムでFHというファイルハンドルを使用しようとしたことが原因です。
  • 具体的には、コード中の$q = new CGI(FH);の部分でFHというファイルハンドルを使用していますが、Perlのstrictモードが有効になっているため、Barewordエラーが発生しています。
回答を見る
  • ベストアンサー

%stderr%の値が何をさしているのか

Bareword "FH" not allowed while "strict subs" in use at C:/Apache Group/Apache2/cgi-bin/cgi.cgi line 1000. Perlを動かしたらこのような標準エラーが帰りました。 FHはファイルハンドルです。 はじめてみるエラーなので何を表しているのかわかりません。 該当のコードは $q = new CGI(FH); です。 open(FH,'<',$save_dir.$ID{$name}.'.dat'); $q = new CGI(FH); close FH; このようにして読み出しています。 new CGIはCGI.pmのクラス作成です。 何が問題なのでしょうか?

  • Perl
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • retr
  • ベストアンサー率75% (30/40)
回答No.1

おそらく、スクリプト中で、use strict を使われていますよね? 詳細は web でいくらでも調べられると思うので割愛しますが、端的に言えばご指摘のメッセージは「文字列が'とか"で囲まれていないよ」というエラーです。 通常、CGIモジュールの new メソッドでは、変数か文字列を受け取るはずです。 今回は変数ではないため、文字列として解釈されますが、'や"で囲まれていないためにエラーが表示されています。 実際には perl は'や"がない場合でもこれを文字列として解釈します。なので、use strict がなければエラーは表示されません。 上記の理由で、FHはファイルハンドラとは解釈されていません。shirousa01 さんがしたいことはおそらく下記の書き方でいけると思います。 open(FH,'<',$save_dir.$ID{$name}.'.dat'); $q = new CGI(\*FH); close FH;

shirousa01
質問者

お礼

有り難うございました。 CGI.pmの仕様ではファイルハンドルを渡すと書いてあったので、そのような方法で渡すとは、気付きませんでした。 問題は解決しました。

関連するQ&A

  • 配列内定義サブルーチン呼び出し

    下記のような配列内定義サブルーチン呼び出しを作成し動作を確認しました。 次にソース2行目の「no strict;」を「use script;」に変更すると Bareword "sub1" not allowed while "strict subs" in use at refsub_OK.pl line 4. Bareword "sub2" not allowed while "strict subs" in use at refsub_OK.pl line 4. Bareword "sub3" not allowed while "strict subs" in use at refsub_OK.pl line 4. Execution of refsub_OK.pl aborted due to compilation errors. とエラーになります。 プログラムはやはり「use script;」を記述したいのですが、「use script;」を記述 したままでエラーにならない方法がありましたらおしえてください。 perlのバージョンは5.12.3、OSはWindowsXP SP3です。 よろしくお願いします。 ---ソースここから--- #!perl no strict; use warnings; my @ary = ( ("input1.txt", "save1.txt", sub1), ("input2.txt", "save2.txt", sub2), ("input3.txt", "save3.txt", sub3), ); while (@ary) { my $p1 = shift(@ary); my $p2 = shift(@ary); my $sub = shift(@ary); print "p1=[$p1] p2=[$p2] sub=[$sub]\n"; &$sub("$p1", "$p2"); } sub sub1 { my ($p1, $p2) = @_; print "sub1: [$p1] [$p2]\n"; } sub sub2 { my ($p1, $p2) = @_; print "sub2: [$p1] [$p2]\n"; } sub sub3 { my ($p1, $p2) = @_; print "sub3: [$p1] [$p2]\n"; } ---ソースここまで---

    • ベストアンサー
    • Perl
  • perlのDigest::MD5;でのMD5算出が異なる

    perlのDigest::MD5;でのMD5算出が異なる 下記、スクリプトをレンタルサーバ上と、WindowsOS上で走らせてみたところ、おなじファイルにも関わらず、MD5が異なります。 何故でしょうか? #!/usr/local/bin/perl use strict; use warnings; use Digest::MD5; my $file = 'test.zip'; my $ctx = Digest::MD5->new; open my $fh, "<$file"; $ctx->addfile($fh); my $md5 = $ctx->hexdigest; close($fh); open my $fh2, ">>md5.txt"; print $fh2 "$file $md5\n"; print "$file $md5\n"; close $fh2;

    • ベストアンサー
    • Perl
  • 「$| = 1;」とは何でしょうか?

    あるcgiスクリプトを見ていたら、冒頭部分に以下のようにありました。(一部省略) --------------------- use strict; use CGI; use Jcode; my $q = new CGI; $| = 1; --------------------- この「$| = 1;」とは何でしょうか?? ちなみにスカラー変数ではなさそうです。(この後出現しないので)

    • ベストアンサー
    • Perl
  • これを実行するとエラーが起こります どうしてですか

    #! /usr/local/bin/perl5 $fname="./maru.dat" open(FH,"+<$fname"); flock(FH,2); chomp($kazu=<FH>); $kazu++; seek FH,0,0; print FH "$kazu\n"; close(FH); exit; これを実行するたびに maru.datの中の数が1つ増えるようにしたいのです そこで同じ階層のところに count.cgiとして 上のような記述をして 実行をしたのですが internalerrorが起こってしまうのです どこがおかしいのか教えて下さい

    • ベストアンサー
    • CGI
  • opendir apache 絶対url

    apache上でcgi-bin/ファイル.cgiのファイル.cgiから特定のディレクトリハンドルを開くために #!/perl/perl/bin/perl -wT use strict; use CGI::Carp qw(fatalsToBrowser); opendir DH, "http://localhost/image/"; opendir DH, "http://localhost/image/" or die "error"; for (readdir DH){ print; } としたのですが オープンできません opendirのパスに絶対urlや相対urlを使用する方法はありませんか?

  • ファイルをアップロードするCGI

    ファイルをアップロードしたいCGIが欲しく サンプルをみつけたのですが、このCGIだと ファイルをアップロードしたときに、ファイル名がアップロードした時刻になってしまいます。 ファイル名を変更することなく、アップロードするにはどう変更すればよいのでしょうか? お願いします。ちなみにアップロードしたいファイルの種類はエクセル形式のファイルです。 プログラムは以下のようになってます。 #!/usr/bin/env perl use strict; use CGI; use CGI::Carp qw(fatalsToBrowser); use POSIX qw(strftime); my $q = new CGI; print $q->header(), $q->start_html(); #print $q->dump; # for debug my $outputdir = "log"; # ファイルを置く先 (ディレクトリ) my $fh = $q->param('uploaded_file'); my ($ex) = ($fh =~ m|(\.[^./\\]+)$|); # 拡張子 if ($fh ne "") { my $timestamp = strftime "%y%m%d%H%M%S", localtime; my $outputfn = "$outputdir/$timestamp$ex"; open(F, "> $outputfn") or die; flock(F, 2); if (defined $fh) { while (<$fh>) { print F $_; } } close F; print qq{saved as <a href="$outputfn">$outputfn</a>}; } print $q->start_multipart_form(-name => 'myform'), $q->filefield(-name => 'uploaded_file'), $q->submit("OK"), $q->endform, $q->end_html(), "\n";

  • ファイルの削除

    open(FH,">data.dat"); print FH "test"; close(FH); これが書いてあるCGIのページにアクセスすると、 自動的に「data.dat」というファイルが作成されますが、 ファイルを削除することは可能でしょうか? つまり、CGIのページにアクセスすると、「data.dat」 ファイルを削除するということです。 ご教授よろしくお願いします。

    • ベストアンサー
    • Perl
  • アパッチやプロバイダのcgi-bin

    ディレクトリにおいてある PerlなどのCGIスクリプトが使う テキストデータ(jouhou.dat)は外部から 見られる心配はないのでしょうか? アパッチの /var/www/cgi-bin/jouhou.dat にアクセスするために 他のパソコンから http://192.168.1.2/cgi-bin/jouhou.dat (192.168.1.2はアパッチが動いているPC) とすればブラウザが表示拒否されました

    • ベストアンサー
    • Perl
  • perl コンストラクタへの引数

    いつもお世話になっております。 コンストラクタへ引数を渡しsyntaxチェックを行うとエラーとなります。 ご教授願えないでしょうか。 ※Perlは一昨日から初めてです。 [エラー内容] sample.pm: Bareword "SAMPLE_LOG" not allowed while "strict subs" in use at sample.pm line 278. [sample.pm] package sample lib ../common/ use Log.pm my $log = Log->new(SAMPLE_LOG); [Log.pm} package main use constant SAMPLE_LOG = 'sample.log'; 定数を定義しているのですが・・・・

  • imgタグのクエリストリングを取得する方法

    IIS + クラシック asp + ActivePerl 環境下で QR コードを取得するプログラムを作っています。 呼び出し元の asp 内に、 <img src = "./cgi-bin/qr_test.cgi?q=hogehoge"> と書きました。 この q=hogehoge を呼び出し先で取得する方法を教えてください。 ===== 呼び出し元 (qr_test.asp) <html> <head></head> <body> <img src = "./cgi-bin/qr_test.cgi?q=hogehoge"> </body> </html> ===== 呼び出し先 (qr_test.cgi) use strict; use warnings; use GD::Barcode; my $url = $in{'q'}; # ここでエラーが出ます。コメントアウトすると正常に動きます。 my $qrimg = GD::Barcode->new('QRcode',$url,{'Ecc'=>'M',Version=>'7','ModuleSize'=>'4'}); binmode(STDOUT); print "Content-Type: image/jpeg\n\n"; print $qrimg->plot->jpeg; exit(0); ===== バージョンは IIS 7.5 Perl 5.14.2 (64bit) です。 どなたかご教授お願いします。

    • ベストアンサー
    • Perl

専門家に質問してみよう