perlプログラムで
サブルーチンの中で、別のサブルーチンを呼び出していますが、
なぜか認識しません。
KCatchでは以下の表示をしています。
Catch: Mon Sep 22 07:56:36 2003
-------------------------------------------------
[regist.cgi:375:die] Undefined subroutine &main::lock called.
>&lock;
-------------------------------------------------
regist.cgi with Perl 5.00502 for freebsd

サブルーチン名には頭に & を付けて呼び出しています。
サブルーチンは、スクリプトの最後にまとめてあります。
同じサブルーチンは、他のスクリプトでも利用していますが、
エラーは出ていないのですが。

何が原因か、わかりません。
関係ないかもしれませんが、プログラム最初の方でuse strict;の宣言をしています。
他のサブルーチンも認識しません。
KCacthの表示は同じ
&main::サブルーチン名 called になっています。
よろしくお願いします。

A 回答 (2件)

下記前提でよいでしょうか。


&lock(); ・・・(lockを呼び出している箇所)

sub lock    ・・・サブルーチン:lockの定義
{
・・・
}
上記は1つのソースファイル上にある。

とすると、考えられるのは、
1.undef (&lock); により未定義にしている。
2.__DATA__のあとにsub lockを定義している為、サブルーチンとして認識されない。(__END__も同様)
です。上記の2点はOKでしょうか?
    • good
    • 0
この回答へのお礼

tatsu99さん 
ご指摘ありがとうございます。

2.__DATA__のあとにsub lockを定義している為、でした。
perl初心者で__DATA__の使い方を知りませんでした。
無事解決しました。

お礼日時:2003/09/25 08:28

これだけではなんとも言えません(^^;


サブルーチンが定義されていないようにPerlには見えるということなのでしょうけれど。

まず、strict宣言についてですが、
一度はずして実行し、確認してみればいいかと思います。
(はずして動かなくなると言うことは普通ありませんから)

一瞬スペルミスの類かとも思いましたが、
前回の書き込みを見る限り他のルーチンも未定義になっているんですよね。
・・となると関係なさそうです。

一番可能性が大きそうなのは、
&lockが、mainパッケージではなくて、
他のパッケージ中にあるという状況ですが・・
(サブルーチンは別ファイルのライブラリやモジュール内を呼び出しているのでしょうか?)
    • good
    • 0
この回答へのお礼

natsuki_tkさん
ありがとうございます。
__DATA__の後にルーチンを呼び出しているのが、間違いだったようで、無事解決しました。

それとは別に、サブルーチンを別ファイルのライブラリやモジュール内で呼び出し方も、調べたいと思います。
ありがとうございました。

お礼日時:2003/09/25 08:35

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q数値かどうかの判定方法

$aに代入されているものが数値かどうかを判定するにはどのようにしたらよいのでしょうか?

Aベストアンサー

$a =~ /^[0-9]*$/
上記の場合、*は「直前のパターンの0回以上の繰り返し」の意味なので、0から9がなくても、つまり$aが空でもマッチしてしまいます。
なので、
$a =~ /^[0-9]+$/
としましょう。
(+は「直前のパターンの1回以上の繰り返し」)
また、0-9は\dで表すこともできるので
$a =~ /^\d+$/
と書くこともできます。

Qcgi 実行時のエラー

perl初心者でまた質問させていただきます。「送信」ボタンをクリックすると、HPで入力してもらった情報をメールで送信するcgiを作成しました。ただ、実行すると、
Can't locate object method "new" via package "Net::SMTP" (perhaps you forgot to load "Net::SMTP"?) at C:\www\cgi-bin\downloadmail.cgi line 62.
というエラーが出ます。
cgiは、
my $smtp = Net::SMTP->new($192.1.1.1);
$smtp->mail($email);
$smtp->to($to);

$smtp->data();
$smtp->datasend("From:$email\n");
$smtp->datasend("To:***@***.co.jp\n");
$smtp->datasend("Subject:テストメール\n"); #件名
$smtp->datasend("Content-Type: text/plain; charset=iso-2022-jp\n\n");
$smtp->datasend("テストメール\n");
$smtp->dataend();
$smtp->quit;
というものです。どなたか分かりましたらお願いします。

perl初心者でまた質問させていただきます。「送信」ボタンをクリックすると、HPで入力してもらった情報をメールで送信するcgiを作成しました。ただ、実行すると、
Can't locate object method "new" via package "Net::SMTP" (perhaps you forgot to load "Net::SMTP"?) at C:\www\cgi-bin\downloadmail.cgi line 62.
というエラーが出ます。
cgiは、
my $smtp = Net::SMTP->new($192.1.1.1);
$smtp->mail($email);
$smtp->to($to);

$smtp->data();
$smtp->datasend("From:$email\n");
$smtp->datasend...続きを読む

Aベストアンサー

Net::SMTPモジュールのロードを指示する
use Net::SMTP;
は書いてある?

1行目の
#!/usr/bin/perl
の下あたりに
use Jcode;
って書いてあると思うので、そこを
use Net::SMTP;
use Jcode;
にしましょう。

QCan't use string ("0") as an ARRAY ref の原因について

Perl 5.6を使っております。
Perlで原因不明なエラーに直面して困っております。
Can't use string ("0") as an ARRAY ref while "strict refs"
というエラーが発生しているのですが
これは良くあるミスとして何が原因でしょうか?

Aベストアンサー

No.2です。書き漏らしてましたが、エラーメッセージの内容がよくわからない時は

use diagnostics;

しましょう。

QPerlで変数を使用した置換ができない

ファイル内の「1 2 3 4 5」などの数字の箇所を、「1回 2回 3回 4回 5回」のように、「回」をつけた形に変えることを考えています。
以下のようなスクリプトを書きましたが、うまくいきません。

# 「$search_replace」の参照先のテキストファイルの内容
(\d) タブ記号 $1回


EOF

# 問題のスクリプト(一部)
chomp($search_replace);
(my $search, my $replace) = split(/\t/, $search_replace);
$string[$i+1] =~ s/$search/$replace/g; #ここが問題と思われる箇所

ほしい結果は右のとおり。「1回 2回 3回 4回 5回」
現実の結果は右のとおり。「$1回 $1回 $1回 $1回 $1回」

置換文字列の$1の部分がうまく展開(?)できないようです。
どうすればよいか、ご教示ください。

Aベストアンサー

正規表現の置換部はダブルクォート文字列と同様に評価されるので、次の2つの文は同じように機能します。質問のケースでは、変数を2重に置き換えなければならないので、明示的にダブルクォートが必要になります。

$string[$i+1] =~ s/$search/$1回/g;
$string[$i+1] =~ s/$search/"$1回"/eg;

QUse of uninitialized value ---

初心者です。フォームに文字を入力してもらい、↓
print blockquote(
textfield(
-name => 'die Antwort',
省略----条件にあえば、
my $value = param('die Antwort');#として
if (($value eq $ans || $value eq $ans2) and ($c eq $num)){
「正解」と表示することにしました。すると、うまくいくのですが、
if (($value eq $ans || $value eq $ans2) and ($c eq $num)){
について「Use of uninitialized value ----」とApacheのerror logに書かれてしまいます。このためerror logがすぐに巨大なファイルになってしまいます。これを避ける方法をお教えください。よろしく、お願いいたします。

Aベストアンサー

コードに use warnings が入っているのですよね。
デバッグも済んでいるのでしたら、
no warnings qw ( uninitialized );
で、この警告の表示を抑制してもよいと思います。

Q文字コードの変換(Shift-JISからUTF8)

文字コードがShift-JISのCSVファイルを読み込み、UTF-8のテキストファイルに出力するのに
プログラムの中で変更しようとしているのですが、うまくいきません。出力ファイルの文字コードを
確認するとShift-JISのままです。
どなたか教えていただけないでしょうか?
ActivePerl v5.16.0を使用し、Encodeモジュールのfrom_toを使用しています。

#!/usr/bin/perl

use strict;
use warnings;

use utf8;
use Encode;

my $input_file="input.csv";
my $output_file="output.txt";
open (IN, $input_file) or die "$!";
open (OUT, ">$output_file") or die "$!";

while (<IN>){
chomp ($_);
my @data=split(/,/,$_);

for(my $i=0;$i<@data;$i++){
$data[$i]=Encode::from_to($data[$i],'shiftjis','utf8'); #Shift-JISからUTF-8に変換
$data[$i]=~s/\s+//g;
print OUT $_;
}
print OUT "\n";
}
close (IN);
close (OUT);

文字コードがShift-JISのCSVファイルを読み込み、UTF-8のテキストファイルに出力するのに
プログラムの中で変更しようとしているのですが、うまくいきません。出力ファイルの文字コードを
確認するとShift-JISのままです。
どなたか教えていただけないでしょうか?
ActivePerl v5.16.0を使用し、Encodeモジュールのfrom_toを使用しています。

#!/usr/bin/perl

use strict;
use warnings;

use utf8;
use Encode;

my $input_file="input.csv";
my $output_file="output.txt";
open (IN, $input_file) or die "$!...続きを読む

Aベストアンサー

あの、私のや他の回答をよく読んで考えてください。


for(my $i=0;$i<@data;$i++){
$data[$i]=Encode::from_to($data[$i],'shiftjis','utf8'); #Shift-JISからUTF-8に変換
$data[$i]=~s/\s+//g;
print OUT $_;
}

この部分は **** $_には何の影響も与えません ****
よって、** 出力に関することだけに注目したら **

for(my $i=0;$i<@data;$i++){
print OUT $_;
}

これと等価です。どこで「Shift_JIS からUTF-8へ変換」してますか?
$_は「while (<IN>){」の<IN>で1行読み込まれ、「chomp ($_);」で末尾の改行コードが削除されただけで、移行なにも変化していません。コードは入力のまま=Shift_JISです。それをそのまま出力すればShift_JISになるのが正解です。
しかも、項目数分だけ繰り返し出力されます。
(重複行になる、と#1に書いたのはchompのことを失念していた私のミスです)

@dataを変更したのなら、出力するのは@dataでしょう。
join(",", @data)とすれば、項目をカンマ区切りの文字列にすることができます。


あと#2にあったfrom_toの使い方。マニュアルをよく読みましょう
http://perldoc.perl.org/Encode.html#[$length-=]-from_to($octets,-FROM_ENC,-TO_ENC-[,-CHECK])
・$octetsを直接変換する
・$octetsの長さを返す
とあります。つまり
$data[$i]=Encode::from_to($data[$i],'shiftjis','utf8')
だと,$data[$i]には元の内容は破棄されて、文字列の長さになってしまいます。



各項目毎に処理したい、という意図はわかりました。

ですが、文字コードの変換が項目毎に違うなんてことはまず無いでしょう。
それならば、$_で1行をコード変換→splitして項目毎の処理、としてもいいのでは?

ついでにPerlIOを使って
open (IN, "<:encoding(shift_jis)", $input_file) or die "$!";
open (OUT, ">:utf8", $output_file) or die "$!";
とでもやれば、プログラム中はコードをあまり意識せずに文字列処理ができます。

あの、私のや他の回答をよく読んで考えてください。


for(my $i=0;$i<@data;$i++){
$data[$i]=Encode::from_to($data[$i],'shiftjis','utf8'); #Shift-JISからUTF-8に変換
$data[$i]=~s/\s+//g;
print OUT $_;
}

この部分は **** $_には何の影響も与えません ****
よって、** 出力に関することだけに注目したら **

for(my $i=0;$i<@data;$i++){
print OUT $_;
}

これと等価です。どこで「Shift_JIS からUTF-8へ変換」してますか?
$_は「while (<IN>){」の<IN>で1行読み込まれ、「chomp ($_);」で末尾の改行コ...続きを読む

Qcgiとplとpm

掲示板ソースをダウンロードするとplやpmという拡張子のものがありました。中身はPerlでした。
拡張子の使い分けを教えてください。

適当に4つのルールを書いてみましたので、間違っていたり、追加するルールがありましたから教えてください。

1 ブラウザがそれ自身にアクセスし、ブラウザのアドレスバーに表示させるならcgiにするべき。

2 Perlのpackageの機能を使うなら、パッケージファイルはplかpmでなくてはならない。

3 Perlのrequireの機能を使うなら、その外部ファイルはplでなくてはいけない。

4 Perlのuseの機能を使うなら、その外部ファイルはpmでなくてはならない。

Aベストアンサー

基本的に拡張子は、あっても無くてもなんでもOKです。ただ、モジュールには.pmをつけなければなりません。
また、webサーバによってCGIとして使える拡張子に制限がある場合があります。

1.について
言語として、特に拡張子を.cgiにしなければならないというのはありません。.plでも.doでも.hoge
でも基本的には大丈夫ですが、大抵運用するwebサーバによって使える拡張子が制限されています。.cgiしかダメなサーバとか。

2.について
そのような制限はありません。拡張子は何でもOKです。
ただ、前述の通りwebサーバによって拡張子の制限がかかっている場合はCGIとしては実行できません。

3.について
そのような制限はありません。拡張子は何でもOKです。

4.について
その通りです。use関数の対象になる外部ファイルは.pmでなければなりません。

QCPANでインストールしたモジュールの削除方法

CPANであるモジュールをインストールしたのですが見当違いのモジュールでした。
削除しなければならず色々調べてみたのですがインストール方法しか見つからず削除方法がわかりません。

どなたかわかる方教えてください。

Aベストアンサー

がると申します。
uninstallは、install方法次第ではあるのですが。
もしcpanコマンド使ってであるとすると、それは実際にはMakefileでのコンパイル&installになります。
で。
make install系の、これは最大の欠点といわれているのですが。「自力で手動で探し出す以外に削除手段はない」です。
# rpm系の唯一にして最大の利点がココの部分の解消ですね。

cpanでのinstallですと、どこか(多分 /root あたり)に.cpan/build/というディレクトリがありまして、その下にソースが展開されているので。
ソースはそこから。.soファイルは…Makefile解析するか、findあたりで探すか、で削除するしかないです。
確か、メジャーなcpanのMakefileはそんなにお行儀悪くないので、そうあちこちには散らかしてないと思うのですが…。

また不明な点などあったら追加で質問していただければ。

Qperl でエラー:Wide character in・・・とは何がいけないのでしょう?

エラーメッセージ:
Wide character in subroutine entry at C:/Perl64/lib/Encode.pm line 221.

この意味と対応策を教えてください。

Aベストアンサー

(昨今の)Perlには「utf8フラグ」なるものがあります。


通常、日本語の仮名や漢字は、複数の文字を組み合わせて表現しています。
例えば、「ア」という文字は
Shift_JISなら \x83\x41 という「2文字」
UTF-8なら \xE3\x82\xA2 という「3文字」
です。
この状態は、1バイト1バイトの文字が並んでいる状態なので、「バイト列」と呼ぶことにします。(バイナリと呼んだりもします)
ファイルには、この形で入っています。

この方式だと、「ア」が1文字として扱われずいろいろと不便です。
例えば、 Shift_JISのアに含まれる \x41 はASCIIコードでのAです。
ここで、s/A/B/ とすると、 AがBに書き変わるだけでなく、ア( \x83\x41)がィ (\x83\x42)に書き変わってしまいます。

そこで、これらを統一扱う「内部形式」というのを作りました。
それが「utf8フラグ付き文字列」です。

読み込み時は
 ファイルや文字列変数でのバイト列 → 復号( decode ) → 内部形式(utf8フラグ付き文字列)
書き出し時には
 内部形式 → 符号(encode) → ファイルや文字列変数でのバイト列
とすることで、内部形式では「ア」を一文字として扱うことができます。s/A/B/としてもアには影響ありません。

復号/符号 は入出力時に自動で行なうようにしたり、Encodeモジュールのdecode,encode等を使用して明示的に行なったりします。

この書き出しの時に、
 内部形式 → 符号(encode) → ファイルや文字列変数でのバイト列
としなければならないところを
 内部形式 → ファイルや文字列変数
と直接おこなってしまった場合、そんなことはできない、と発生するのが「 wide character 〜」の警告です。


対処法は、 上記のようにencodeすることです。
また、場合によっては decode を抑制して 最初からバイト列で扱う方が正しいこともあります。
具体的なことは、実際のコードとやろうとしていることがわかならないと答えられません。

(昨今の)Perlには「utf8フラグ」なるものがあります。


通常、日本語の仮名や漢字は、複数の文字を組み合わせて表現しています。
例えば、「ア」という文字は
Shift_JISなら \x83\x41 という「2文字」
UTF-8なら \xE3\x82\xA2 という「3文字」
です。
この状態は、1バイト1バイトの文字が並んでいる状態なので、「バイト列」と呼ぶことにします。(バイナリと呼んだりもします)
ファイルには、この形で入っています。

この方式だと、「ア」が1文字として扱われずいろいろと不便です。
例えば、 Shift_JISのアに...続きを読む

QPerlで環境変数を設定するには

あるPathを環境変数として設定したい場合、
例)TNS_ADMIN=D:\Test\exe

たとえばMS-DOSなら、
set TNS_ADMIN=D:\Test\exe
と設定しますよね。

これと同じことをPerlでどうやればいいのかというのが質問です。

ENVモジュールを使って、
$ENV{TNS_ADMIN}=D:\Test\exe
としてみたものの、Perlを実行した後に確認してみるとセットされていないようでした。
(確認方法はPerlを実行したDOSプロンプトにて"set"を実行)

よろしくお願いします。

Aベストアンサー

>>破棄された後に確認しても、わかりません。
>どうにかその環境変数がセットされていることを確認する方法ってないのでしょうか?

perlで子プロセスを起動すれば確認できます。

例えば、NT系のOSであれば...

次のスクリプトを用意。
#!c:\perl\bin\perl.exe
$ENV{"TNS_ADMIN"}="D:\\Test\\exe";
system("cmd");

それを実行すると、コマンドプロセッサが表示されるので、
set[return]
すれば、子プロセスの環境変数が確認できます。
確認後、exit[return]すると、子プロセスが終了するので、
親プロセスたるperlも終了する。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報