モジュールのロード方法で警告を消す方法

このQ&Aのポイント
  • モジュールを必要な時のみロードするためにuseではなくrequireを使用することはよくありますが、ワーニングをオンにしている場合、変数を参照する箇所で名前が一度しか使用されていない可能性がある警告が表示されます。
  • 警告を消すためには、use文を使ってモジュールをロードするか、use strictプラグマを使用して変数を宣言することが推奨されます。
  • 警告を無視する場合は、use warningsプラグマを使用することで一部の警告を非表示にすることができます。ただし、警告が発生する原因を把握し修正することが望ましいです。
回答を見る
  • ベストアンサー

警告を消したい

モジュールなどのロードを必要時だけにするため、useではなくrequireを使うことはよくあると思いますが、ワーニングをオンにしている場合、そのrequireしているパッケージの変数を参照している箇所で Name "~" used only once: possible typo at~ という警告が出てしまいます。 たとえば、 require DBI; : my $dbh = DBI->connect(~) or die $DBI::errstr; というコードだと$DBI::errstrについて警告されてしまいます。 もちろんuseなら警告は出ません。 この警告は、何とかならないものでしょうか。

  • cc-to
  • お礼率81% (22/27)
  • Perl
  • 回答数2
  • ありがとう数3

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

  • ベストアンサー
  • kabaokaba
  • ベストアンサー率51% (724/1416)
回答No.2

>この箇所(or変数)だけ回避できる方法があれば これで一箇所だけ回避できませんか Perl Hacksあたりに (そこではstrictの回避だった気がしますが)で こんなのがあったと思います. #動かしてないので駄目かもしれませんが,ご参考まで. my $dbh; { no warnings 'once'; $dbh = DBI->connect(~) or die $DBI::errstr; }

cc-to
質問者

お礼

御指示通りで解決できました、ありがとうございます。 プラグマをブロックでスコープさせることができるということ自体を、知りませんでした・・・。お恥ずかしい限りで よくみたらperllexwarnにもperlfaqにもしっかり書いてありましたね・・。 重ね重ね、ありがとうございました。

その他の回答 (1)

  • kabaokaba
  • ベストアンサー率51% (724/1416)
回答No.1

no warning 'once'; でいきませんか? perldoc perllexwarn でwarningの階層構造を参照してください. もっとも・・・すなおに use するのが一番だと思いますが. 個人的には use strict; use warning 'FATAL'; くらいで通るように心がけたい.

cc-to
質問者

お礼

早速ありがとうございます。 うーんやっぱりそうするしかないんですかね・・・ できれば、警告の機能自体は役立つので生かしておいて、この箇所(or変数)だけ回避できる方法があれば一番なんですが。 varsとかあるいは無意味に変数名だけを書いて2回参照するようにしたりしてるんですが、どうも良い方法とは思えなくて・・

関連するQ&A

  • perlのDBIからmysqlにINSERTINTOをやっても追加されない。help!!

    助けてください、お願いします。 phpadminで管理しているmysqlのDBへ、perlのDBIモジュールを使ってレコードの追加(INSERTINTO)をやっても、phpadminでDBをみてみると追加されていません。 DBIを組み込んだCGIを実行してみてもエラーはでないのですが、DBへの追加ができていません。 色々とやってみたのですが、どうしても追加ができません。考えられる要因があれば教えてください、お願いします。ソースは以下の通りです。 use DBI; $dbh=DBI->connect('DBI:mysql:データベース名:サーバホスト','ユーザ名','パスワード') or die $DBI::errstr; $sthandler = $dbh->prepare("INSERT INTO `table名` (`姓`, `名`, `メールアドレス`, `年齢`) VALUES ('名字', '名前', 'mailaddress', '0')"); $sthandler->execute; $sthandler->finish(); $dbh->commit; $dbh->rollback; $dbh->disconnect; 本当に困っています。どうかお助けください。

    • ベストアンサー
    • MySQL
  • 外部ファイルのインクルードについて

    外部ファイルにデータベースアクセスの為のユーザ情報を書いておき、DB接続が発生するファイルにのみ、インクルードさせたいと考えております。下記のようなプログラムを記述したのですが、エラーが出てしまいました。自分でネットで調べたのですが、間違っていないように感じます。何か、間違っていますでしょうか? my $dbh = DBI->connect部(グローバル変数が読み込めない)でエラーが発生しております。 #!/usr/local/bin/perl use DBI; require 'db.conf'; $ENV{ORACLE_HOME}='/opt/app/oracle/product/9'; my $dbh = DBI->connect($datasrc, $username, $password) || die DBI::errstr; my $sql = "SELECT * FROM NAME"; my $sth = $dbh->prepare($sql) || die $dbh->errstr; $sth->execute || die $dbh->errstr; ~ 省略 ~ ---------db.confの中身(パーミッション755)--------- my $datasrc = "oracle9"; my $username = "test"; my $password = "password"; 1; #return true ----------エラーログ------------------ Global symbol "$datasrc" requires explicit package name at /web/hthome/cgi/test.cgi line 7. Global symbol "$username" requires explicit package name at /web/hthome/cgi/test.cgi line 7. Global symbol "$password" requires explicit package name at /web/hthome/cgi/test.cgi line 7. 宜しくお願い致します。

    • ベストアンサー
    • Perl
  • 未だpostgresにアクセス出来ません。教えて下さい。

    こんにちわ。windowsXP,postgres8.2,perl5を使用して居ります。 postgresにperlからアクセスし、既存のテーブルの行に値を入れたいのですが、 valuesに数字以外の文字を指定するとpostgresに文字列が認識されません。教えて頂きたいことは、 仮に数字を6行目の$に入れると認識されるのですが、文字だと出来ないのは、どうしてでしょうか。$id='○○'と 文字を入れてみるとpostgresには1の結果だけが入ってきました。どのようにしたら良いかと、 思いprint'○○',$idとしてみました。すると下記のプロンプトでのエラーがでました。 構文が間違えていると思うので、良い方法があったら教えて下さい。宜しくお願いします。 #!c:/perl/bin/perl use DBD::Pg; use DBI; require'jcode.pl'; $dbh=DBI->connect("dbi:Pg:host=localhost;dbname=kensaku",'windws','aaaa')||die $dbh->errstr; print'9',$id;print'山田',$word1;print'd',$word2;print'w',$word3;print'c',$head;print'a',$img; @bindvalues=($id,$word1,$word2,$word3,$head,$img); &jcode::convert(*bindvalues,'euc'); my$b=(<<"EOL"); insert into kensaku(id,word1,word2,word3,head,img) values($id,$word1,$word2,$word3,$head,$img) EOL ; $sth=$dbh->prepare($b)||die $dbh->errstr; $sth->execute()||die $sth->errstr; $dbh->disconnect; $sth=$dbh->prepare($b)||die $dbh->errstr; $sth->execute()||die $sth->errstr; $dbh->disconnect; コマンドプロンプトのエラー DBD::Pg::st execute failed: ERROR: syntax error at or near "," at character 103 at test.pl line 19. ERROR: syntax error at or near "," at character 103 at test.pl line 19.

  • 「-wc」オプションの文法チェックで、警告が出ないようにするには?

    「-wc」オプションの文法チェックで、警告が出ないようにするには? たとえば「temp.pl」というライブラリに変数「$A」が定義されてあり、 それを「temp.cgi」というPerlスクリプトで参照したいとします。 これらを、「-wc」オプションを使って文法チェックをすると、 「変数$Aが一度も設定・参照されてないよ」といった旨の警告が出てしまいます。 この警告を出さないようにするにはどうしたらいいのでしょうか? 警告を出さないようにする記述方法って、なにかあるのでしょうか? それとも出てしまうのは仕方ないのでしょうか? 以下、実際のソースの中身および文法チェック結果です。 よろしくお願いします。 ===temp.plの内容=== #! c:/perl/bin/perl $A = '123'; 1; ===temp.cgiの内容=== #! c:/perl/bin/perl require "temp.pl"; print $A; ===文法チェック結果=== >perl -wc temp.pl Name "main::A" used only once: possible typo at temp.pl line 2. >perl -wc temp.cgi Name "main::A" used only once: possible typo at temp.cgi line 3.

    • ベストアンサー
    • Perl
  • perlを使ってレコード件数を取り出してみると、すごい数が・・・。

    perlのDBIモジュールを使って、mysqlのレコード件数を表示させてみると、すごい数が表示されました。ソースは以下の通りです。 use DBI; $dbh=DBI->connect("DBI:mysql:データベース名:サーバ名", "ユーザ名", "パスワード") || die $DBI::errstr; if(!$dbh){ print "エラーです。入力を確認してください。"; exit; }else{ #接続成功 # SELECT文発行 $sth=$dbh->prepare("SELECT sei, mei, mail FROM table"); #実行 $sth->execute; $num_rows = $sth->rows; print "該当 $num_rows, 件\n"; # 開放 $sth->finish; # AUTO COMMITがOFFの場合はCOMMITが必要 $dbh->commit; # 切断 $dbh->disconnect; } 実行すると該当 4294967294, 件 とブラウザに表示されました。僕はレンタルサーバを使っているわけですが、僕のデータベースにはレコードは3件しかないのです。これはレンタルサーバのデータベースすべての件数が表示されているのでしょうか? なんだかSQLを実行するのが怖いので、考えられる原因を教えてください。よろしくお願いします。 プログラムを初めてまだ、数ヶ月しか経ってない初心者なので、みなさんの知恵を貸していただけると幸いです。

    • ベストアンサー
    • MySQL
  • PerlからのCSV出力

    Perl初心者です。 PerlでOracleに接続し、結果をCSVを出力したいのですが 下記プログラムだとなにも出力されません。 Oracle10g OS:Linux *** #!/user/bin/perl # # # DBI モジュールの読み込み use DBI; #接続 my $hDb = DBI->connect("dbi:Oracle:dbname", "user/pass") or die "CONNECT ERROR $DBI::errstr"; #SELECT # $hSt = $hDb->prepare("SELECT ID,NAME FROM MASTER"); open(OUT, ">data.dat"); #実行 $nRes = $hSt->execute; #データの取得 while($raRes = $hSt->fetchrow_arrayref) { print OUT join(",", @$raRes), "\n"; } # ファイルクローズ close(OUT); $hSt->finish; $hDb->disconnect;

  • DBD::mysqlで「表」という文字をテーブルへインサートしたい

    お世話になります。 環境は windows2000pro perl 5.8.8 mysql 5.0.22 です。 mysqlの文字コード関連の設定はmy.iniにてsjisに統一してあります。 DBIを使って、perlスクリプトからmysqlのテーブルへ「表」という文字をインサートしようとするとエラーになります。mysqlクライアントからならちゃんと「表」もインサートできました。 エラーは以下のようになっています。 「 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''表\')' at line 1表 」 とにかくインサートしようとする文字列の最後の文字が「表」なら同様のエラーになります。 「表示」なら問題なくインサートできます。表の2バイト目が5cなのがまずいと思うのですが、どう対処すればよいかわかりません。 ヒントを下さい。よろしくお願いします。 ----- use strict; use DBI; use Encode qw(from_to); my $str = "表"; from_to($str,'utf8','shiftjis'); eval { my $dbh = DBI->connect( 'dbi:mysql:test,hostname=localhost', 'root','bnogl399',{ RaiseError => 1, PrintError => 0}); $dbh->do("set names sjis"); $dbh->do("use mydb"); $dbh->do("insert into foo values (3, " . $dbh->quote($str) . ")"); $dbh->disconnect(); }; print $DBI::errstr if $@;

  • fetchrow_arrayとfetchrow_hashrefの使い方

    Jやまとです。 PerlからSELECT文を実行して結果の行の値を取得する単純なスクリプトを作成しています。 (1)fetchrow_array使用 (2)fetchrow_hashref使用 以上2通りの方法で試したのですが、(2)がInternal Server Errorになります。 原因が全く分かりません。 分かる方いらしゃいましたら、ご教授願います。 OS:TurboLinux6.2 DB:Oracle8i Apache,PerlはTurboLinux6.2に入っているものをそのまま使用 以下、ソースを記載します。 --------------- (1)fetchrow_arrayを使用して行の値を取得(こっちは動く) $dbh = DBI->connect($ds, $user, $pass) || &dbErr("Database can't connect." . $DBI::errstr); $sql = "SELECT SYSDATE FROM DUAL \n"; $sth = $dbh->prepare( $sql ); $sth->execute or die "Cannot execute. " . $sth->errstr(); $cnt1 =1; while (@row = $sth->fetchrow_array()) { @{$get_date[$cnt1]} = @row; $cnt1++; } --------------- (2)fetchrow_hashrefを使用して行の値を取得(こっちが動かない) $dbh = DBI->connect($ds, $user, $pass) || &dbErr("Database can't connect." . $DBI::errstr); $query = qq{ SELECT SYSDATE FROM DUAL }; $sth = dbh->prepare($query); $sth->execute(); # 実行 if($sth->rows() != 1){ # 該当する行数 # エラー処理 } $rhash = $sth->fetchrow_hashref(); %hash = {%{$rhash}}; $sth->finish(); $get_date = $hash{SYSDATE}; --------------- (2)実行時のerror_log Can't locate object method "prepare" via package "dbh" at /u01/ora1/www/htdocs/hoge.cgi line 30. Premature end of script headers: /u01/ora1/www/htdocs/hoge.cgi --------------- (本文長くてすみません)

    • ベストアンサー
    • Perl
  • DBIモジュールと Perl5.8

    Perl5.8のエンコードが理解できずに困っております。 MySQLでは、utf8の文字コードのデータがあります。 以下のスクリプトを実行させると、 Wide character in print at C:/usr/local/site/lib/DBI.pm line 1008. となります。 対処方法はあるのでしょうか? use utf8; use strict; use DBI; my $dbh = DBI->connect("dbi:mysql:dbname=test", "root", "", { AutoCommit=>1, PrintError=>1, RaiseError=>1} ); my $fname = "test.txt"; my $sth = $dbh->prepare("select id, namae from test order by id asc;"); $sth->execute(); # 出力ファイルを開く。 open FILE, ">" , $fname or die "Can't open $fname: $!"; # 整形された結果をファイルにダンプする。 my $rows = $sth->dump_results(80, "\n", ",", \*FILE); # 出力ファイルを閉じる。 close FILE or die "Error closing result file: $!\n"; $dbh->disconnect();

    • ベストアンサー
    • Perl
  • PerlでMysqlのデータベース、テーブル作成

    はじめまして。 perlからMysqlのデータベースやテーブルを作成したいと思っております。 webを検索してみたのですが、どれもデータベースに接続してから、データの操作(挿入や削除など)をするものばかりで、データベースの作成などが見つかりません。 perlからデータベースの作成などは出来ないのでしょうか?また、出来るのでしたら、どのように書けばいいのでしょうか? 以下は、データベースに接続する場合です。 use DBI; $database="testdata"; $hostname="localhost"; $user = "aaa"; $password = "test"; $dsn="DBI:mysql:database=$database:host=$hostname"; $dbh = DBI->connect($dsn,$user,$password)||die $DBI::error; 宜しくお願いします。