外部ファイルのサブルーチンを(requireを使って)読み込んで使用したいのですが、どうもうまく行きません。
cgiファイルとplファイル、どっちも作って両方試してみましたがだめでした。
なにかこの方法だとできないことなど制限ってあるのでしょうか。
それとも、何か特別な処理が必要なのでしょうか。
原因が分からず困っています。

A 回答 (1件)

どのようにうまくいかないのか分からないので、


いくつか考えられる点を上げておきます。

1.requireされるファイルの最後で、1(真)を返していない。
ファイルの最後(サブルーチンの外)に「1;」等の記述があるか確認してください。

2.requireされるファイルのサブルーチンから、必要な変数にアクセスできない。
変数がmyで宣言されていると、外部ファイルからアクセスできません。
適切にスコープを宣言してください。

3.そもそもrequireできていない。
シェルが使える環境でしたら、「perl -e 'require "file";'」を実行して、
エラーが出ないか確認してください。(fileは実際のファイル名に置き換えてください。)

思い当たる箇所がなければ、perl -wc でのエラー表示や、
サブルーチン自体を、差し支えない範囲で載せていただけると
分かるかもしれません。
    • good
    • 0
この回答へのお礼

お答えいただいて本当にありがとうございました。
ご指摘どおり(1)が原因でした。
やっぱり特別な処理が必要だったんですね。

おかげさまで、正常に動くようになってとても助かりました。

お礼日時:2002/04/07 22:52

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

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

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

Qrequire文が実行できない

perl で

require 'cgi-lib.pl'; または require "jcode.pl";
を実行すると、

Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator, admin@mshome.net and inform them of the time the error occurred, and anything you might have done that may have caused the error.

More information about this error may be available in the server error log.

というメッセージが出ます。(cgi-lib.pl、jcode.plは同じディレクトリにあります。)

perl で

require 'cgi-lib.pl'; または require "jcode.pl";
を実行すると、

Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator, admin@mshome.net and inform them of the time the error occurred, and anything you might have done that may have caused the error.

More information about this error may be available in the server error log.

というメッセージ...続きを読む

Aベストアンサー

ローカルで試されているとのことなので

More information about this error may be available in the server error log.

とあるのならログをみてみてはどうでしょう。

QPerlで特定行から特定行までを抜き出したい

皆さんのお知恵をお貸し頂ければ幸いです。

Perlで以下のようなことをしたいと考えています。
例えば、次のようなテキストファイルがあったとします。

example.log
==================================
aaaa
hogehoge
test
okok
perl
script
==================================

上記ファイルを読み込んで、「hogehoge」から「perl」の間に挟まれた行だけ抜き出したいのです。
イメージとしては、読み込んだファイルを配列に入れて、一行づつ読ませ、キーワード「hogehoge」が現れたらそこでフラグを立て、それ以降の行を表示し、キーワード「perl」が現れた時点で表示を止めるという処理になるのかな?と思っています。

このような場合、どういう風にすればいいのでしょうか?
恐れ入りますが、ご教授頂ければ幸いです。

それでは、どうぞよろしくお願い致します。

Aベストアンサー

> 一行づつ読ませ、キーワード「hogehoge」が現れたらそこでフラグを立て、それ以降の行を表示し、キーワード「perl」が現れた時点で表示を止めるという処理になるのかな?と思っています。

それでいいと思いますよ?これをそのままコード化すると、こんな感じでしょうか。(No.1さんのとはちょっと結果が違います。)

open FH, "example.log" or die $!;
$flag = 0;
while ($data = <FH>) {
  chomp $data;
  if  ($data eq "hogehoge") { $flag = 1 }
  elsif ($data eq "perl")    { $flag = 0 }
  elsif ($flag) { print "$data\n" }
}
close FH;

で、もっと略したいPerlな人だとこんな感じ。Perl独特の記法がふんだんに使われているので、勉強するには不向きかもしれませんが^^;

open FH, "example.log" or die $!;
while (<FH>) {
  print if /^hogehoge$/ .. /^perl$/ and !/^(?:hogehoge|perl)$/;
}
close FH;

※インデントに全角空白を使っているので、コピーする場合はタブなどに置換して下さい。

> 一行づつ読ませ、キーワード「hogehoge」が現れたらそこでフラグを立て、それ以降の行を表示し、キーワード「perl」が現れた時点で表示を止めるという処理になるのかな?と思っています。

それでいいと思いますよ?これをそのままコード化すると、こんな感じでしょうか。(No.1さんのとはちょっと結果が違います。)

open FH, "example.log" or die $!;
$flag = 0;
while ($data = <FH>) {
  chomp $data;
  if  ($data eq "hogehoge") { $flag = 1 }
  elsif ($data eq "perl")    { $fl...続きを読む

Qplファイルの中で他のplファイルを実行

A.plファイルとそれに付随するpmファイルがあります。

別のB.plでA.plに値を渡しながらループさせてA.plを実行し得られた値をB.plに返すことがしたいのですが、

B.plで

ループ始点
require('A.pl');
ループ終点

だと一回きりの実行結果しか得られず。

#`perl A.pl @AAA`;
だとreturnできずエラー

となってしまいます。

何か良い方法は無いでしょうか。

よろしくお願いいたします。

Aベストアンサー

こんな感じでは?

$ head *
==> a.pl <==
print @ARGV;
1;

==> tmp.pl <==
$\ = "\n";
foreach (1..10) {
require ('a.pl');
delete $INC{'a.pl'};
}

$ perl tmp.pl value
value
value
value
value
value
value
value
value
value
value


人気Q&Aランキング