ここから質問投稿すると、最大10000ポイント当たる!!!! >>

perlでの話なのですがrequireを使って、
例えば、以下のようにした場合、
同じファイルを何回もコンパイルすることになるのでしょうか。
どなたか教えていただけないでしょうか。

@xx=(1,2,3);

for(@xx){
require "xx.pl";
}

どうしてもCGIがサーバーに与える負荷を軽減したいので、
無駄なコンパイルならば、一回だけrequireするようにしたいのです。

A 回答 (3件)

特に、意図があって見つけたページではありませんが


「perl require」で検索したらすぐに見付かりました
http://cocohome.hp.infoseek.co.jp/perl_ref/requi …
というのでどうでしょう。

実験してみるのが良いと思うので
呼び出される側のファイルで、読み込まれたときに
何か文字列をファイルか標準出力に出してみたらどうでしょう。
    • good
    • 0
この回答へのお礼

requireについて書かれたページを見つけてくださり、
ありがとうございます。
後で、実験してみようと思います。

お礼日時:2008/02/22 01:43

ドキュメント見れば書いてますよ。



perldoc -f require

Otherwise, "require" demands that a library file be included if
it hasn't already been included. The file is included via the
do-FILE mechanism, which is essentially just a variety of "eval"
with the caveat that lexical variables in the invoking script
will be invisible to the included code. Has semantics similar to
the following subroutine:


Note that the file will not be included twice under the same
specified name.

perldoc.jp あたりに日本語訳されてるものもあるはずです。
ファイル名は perlfuc です。
    • good
    • 0
この回答へのお礼

わざわざ、ドキュメントをコピーして見せてくださり、
ありがとうございます。
私は、perl素人なので、そういうところを見るなんて思いつきませんでした。
これからは、もう少しちゃんと調べてから、質問するようにします。

お礼日時:2008/02/22 01:47

コンパイルではない気も。


まぁ、それはさておいて、ループないのファイル読み込みは、あまりお行儀がよくないですよ。
一度ファイルを読み込んで、その中にある関数を読み込んだ方が、処理も軽いかと。
    • good
    • 0
この回答へのお礼

ご指摘ありがとうございます。
ですが、どうしても、ループ中に読み込まないといけないところ
(ループ開始前にはライブラリ内のサブルーチンが必要かどうか判断できない、
というより、調べようと思えばできるけど、無駄な処理が増えるだけ)があるので、
なんとかしたかったのです。

お礼日時:2008/02/22 01:39

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

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

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

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

Aベストアンサー

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

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でなければなりません。

QExcelで正規表現やワイルドカードなどを使って置換したいのですが…

Excelの中で置換をしたいのですが、
例えば以下のように( )かっこでくくられた不規則な数字を検索し、その前後に記号を付加するといった具合です。
Wordだと置換で正規表現が使えますが、Excelではやはりマクロを作らないとだめなのでしょうか?

 置換前
  あいう(123)かきく(あああ)
  さしす(ははは)たち(589)つ
   ・      ・
   ・      ・

 置換後
  あいう★(123)★かきく(あああ)
  さしす(ははは)たち★(589)★つ
   ・      ・
   ・      ・

Aベストアンサー

以下の正規表現アドインを使用すると可能です。
http://srcedit.pekori.jp/tool/excelre.html

置換前 ((\d+))
置換後 ★$1★

QPerlからメール送信で文字化け

Perl5.8からsendmailを使ってメール送信しています。
髙や﨑が入ると文字化けします。文字化けしないようにする方法を教えてください。



#!/usr/bin/perl
require 'jcode.pl';
require 'mimew.pl';
$sendmail = '/usr/lib/sendmail';

print"Content-type: text/html\n\n test\n";

if (!(open(OUT,"| $sendmail -t -i -f xxxx\@hogehoge.co.jp"))) { ; }

print OUT "To: xxxx\@hogehoge.co.jp\n";
print OUT "From: xxxx\@hogehoge.co.jp\n";
print OUT "Reply-To: xxxx\@hogehoge.co.jp\n";

$subject = "サブジェクト 髙﨑";
$subject = &mimeencode($mail_subject);
print OUT "Subject: $mail_subject\n";

print OUT "Mime-version: 1.0\n";
print OUT "Content-Type: text/plain\; charset=\"ISO-2022-JP\"\n";
print OUT "Content-Transfer-Encoding: 7bit\n\n";

$honbun = "メール本文 髙﨑";
&jcode'convert(*honbun, 'jis');
print OUT "$honbun\n";

close(OUT);

Perl5.8からsendmailを使ってメール送信しています。
髙や﨑が入ると文字化けします。文字化けしないようにする方法を教えてください。



#!/usr/bin/perl
require 'jcode.pl';
require 'mimew.pl';
$sendmail = '/usr/lib/sendmail';

print"Content-type: text/html\n\n test\n";

if (!(open(OUT,"| $sendmail -t -i -f xxxx\@hogehoge.co.jp"))) { ; }

print OUT "To: xxxx\@hogehoge.co.jp\n";
print OUT "From: xxxx\@hogehoge.co.jp\n";
print OUT "Reply-To: xxxx\@hogehoge.co.jp\n";

$subject = "サ...続きを読む

Aベストアンサー

根本的には perl の問題ではありません。
「髙」や「﨑」といった文字は、JIS(ISO-2022-JP)では規定されていないため、
ISO-2022-JPのメールに入れることはできないのです。

文字コードがUnicodeであれば、「髙」や「﨑」を表現できますので、

・perlのスクリプトを、Unicode(UTF-8)で記述するようにする
・メールのcharset を UTF-8で送信するようにする
・文字コードの変換を、perl4時代の古いライブラリ(Unicode非対応)である「mimew.pl」や「jcode.pl」ではなく、perl5世代の「Encode.pm」を使う

という対応になるかと思います。

---ここから---
#!/usr/bin/perl
use strict;
use utf8;

use Encode;

my $sendmail = '/usr/lib/sendmail';

print "Content-type: text/html\n\n test\n";

my $out;
if (!(open($out,"| $sendmail -t -i -f xxxx\@hogehoge.co.jp"))) { ; }

print $out "To: xxxx\@hogehoge.co.jp\n";
print $out "From: xxxx\@hogehoge.co.jp\n";
print $out "Reply-To: xxxx\@hogehoge.co.jp\n";

my $mail_subject = "サブジェクト 髙﨑";
$mail_subject = encode('MIME-Header', $mail_subject);
print $out "Subject: $mail_subject\n";

print $out "Mime-version: 1.0\n";
print $out "Content-Type: text/plain\; charset=\"UTF-8\"\n";
print $out "Content-Transfer-Encoding: 8bit\n\n";

my $honbun = "メール本文 髙﨑";
$honbun = encode("UTF-8", $honbun);
print $out "$honbun\n";

close($out);
---ここまで---

といった形でしょうか。

ただし、最近はまず大丈夫だと思いますが、
「日本語のメール」としては、ISO-2022-JPで送るのが主流であり、UTF-8で送った場合にはメールソフトによっては問題が出るかもしれないことは覚悟する必要があるかと思います。

根本的には perl の問題ではありません。
「髙」や「﨑」といった文字は、JIS(ISO-2022-JP)では規定されていないため、
ISO-2022-JPのメールに入れることはできないのです。

文字コードがUnicodeであれば、「髙」や「﨑」を表現できますので、

・perlのスクリプトを、Unicode(UTF-8)で記述するようにする
・メールのcharset を UTF-8で送信するようにする
・文字コードの変換を、perl4時代の古いライブラリ(Unicode非対応)である「mimew.pl」や「jcode.pl」ではなく、perl5世代の「Encode.pm」を使う

という対...続きを読む

QPerlで 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 初心者です。初めて質問します。

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 "$...続きを読む

Aベストアンサー

端的に言えば「our するなりパッケージで修飾するなりしてください」となります.

詳細はこんな感じ:
このエラーはコンパイル時のエラーであって実行時のエラーではありません. つまり, 実行に先立つコンパイルのときに「use strict が有効なのに my も our も state もされていない (かつパッケージ名での修飾もされていない) 変数 $hoge が現れた」というエラーです.

「require されたファイルの中に our がある」のは確かですが, 次の 2つの理由によりそれは影響しません:
・use とは異なり, require によるファイルの取り込みは実行時に行われます. つまり
require 'test_sub.pl';
とあってもコンパイラは test_sub.pl の中は見ません. したがって「test_sub.pl の中の our」はコンパイル時には影響を与えません.
・また, our の有効範囲はレキシカルスコープに制限されています. そして「1つのソースファイル」はレキシカルスコープとなりますから, require をコンパイル時に行っても「test_sub.pl の中の our」は test_sub.pl の中 (もちろん our 以降の) でしか有効ではありません.

余談ですが, use strict もレキシカルスコープで有効となります. つまり, 「test_sub.pl の中の use strict」はそれを require した test_main.pl では無効です (し, 逆に require する前に test_main.pl で use strict してもそれは test_sub.pl には影響しません)

端的に言えば「our するなりパッケージで修飾するなりしてください」となります.

詳細はこんな感じ:
このエラーはコンパイル時のエラーであって実行時のエラーではありません. つまり, 実行に先立つコンパイルのときに「use strict が有効なのに my も our も state もされていない (かつパッケージ名での修飾もされていない) 変数 $hoge が現れた」というエラーです.

「require されたファイルの中に our がある」のは確かですが, 次の 2つの理由によりそれは影響しません:
・use とは異なり, require によるフ...続きを読む


人気Q&Aランキング