Perlでプログラムを組むにあたって、外部ファイルの読み込みをすると(requie ~)重くなると聞いたのですが、他にこういうことをすると重くなる、などということがありましたら、教えていただけますでしょうか?
参考URLなどがありましたら、そちらだけでも結構です。

(そんなに重いプログラムを作れるようなレベルじゃないので、今は参考程度にお伺いしたいだけですので、お暇なときにでもよろしくお願い致します。)

このQ&Aに関連する最新のQ&A

A 回答 (2件)

ラクダ本(「プログラミングPerl」)第8章「その他もろもろ」に


「8.3効率の問題」というのがありますから、それを読んでおくと
勉強になりますよ。:-)

ブ厚い本ですから、コンピュータ系に強い書店へいけばすぐ見つかります。
    • good
    • 0

文字列操作(正規表現、splitなど)が特に重たいです。


顕著に出る例がjcode.plでの文字コード変換で、100kのデータを食わせたら、CPU負荷が5桁x5桁演算の10,000回ループ程度になった記憶があります。

参考URL:http://www.effectiveperl.com/
    • good
    • 0

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

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

QPerlの出力を、Perlから実行するプログラムの標準入力にしたい

現在データを収集してくるPerlのスクリプトを作っています。

このスクリプトから、ローカルにある、別のrubyスクリプトに、収集してきたデータを渡したいのですが、rubyスクリプトは、標準入力を前提として作られています。
簡単に考えると、一旦ファイルに落として、そのファイルをリダイレクトする形でPerlからrubyスクリプトを起動すればよさそうなのはわかるんですが...

なにか他にうまい方法がPerlにはあるはずだといろいろ探しているのですが、見つかりません。

ファイル渡ししか方法は無いのでしょうか?

Aベストアンサー

パイプでオープンすればよろしいのでは?

参考URL:http://www.stackasterisk.jp/tech/program/perl02_01.jsp

QPerlでニュースプログラム

お世話になります。looserと申します。

Perlで、ニュースプログラムを作っているのですが、どうしてもやり方がわからなくて、教えていただきたいのです。

データファイルがあり、年度ごとの一覧をCGIからHTMLで出力し、また最初のページには、今年度の記事の一覧があり、それぞれの記事をクリックするとその記事の詳細が出てきます。
それぞれの記事には、全部の年の目次があって、その年の目次はクリックできないようにするというようなものを作りたいのです。


--data.csv--
1,2002,記事1
2,2002,記事2
3,2003,記事3
4,2003,記事4
5,2003,記事5
6,2004,記事6
7,2005,記事7


-------プログラム---------

@data = &ReadData();#data.csvの読み込み

#年一覧の配列の作成
foreach (@data){
($no,$year) = split(/,/);
unless($year == $last){push(@year_list,$year);}
else{$last = $year;}
}


foreach $yr (@year_list){#年ごとのループ
chomp($yr);
foreach $data (@data){#データループ
($no,$year,$message) = split(/,/,$data);
if($year == $yr){
#
#この辺で配列格納?それともページ出力?
#
}
}
}

--------------------------

これでやると、それぞれの年の一覧ページの出力が出来ないのです。
どなたか分かる方、また、サンプルになるスクリプトなどをご存知の方お願いいたします。

やりたい事
1.年度ごとの記事一覧の出力
2.記事ごとのページの出力
3.年のインデックス(目次)の出力→全ページに付く

お世話になります。looserと申します。

Perlで、ニュースプログラムを作っているのですが、どうしてもやり方がわからなくて、教えていただきたいのです。

データファイルがあり、年度ごとの一覧をCGIからHTMLで出力し、また最初のページには、今年度の記事の一覧があり、それぞれの記事をクリックするとその記事の詳細が出てきます。
それぞれの記事には、全部の年の目次があって、その年の目次はクリックできないようにするというようなものを作りたいのです。


--data.csv--
1,2002,記事1
2,2002,...続きを読む

Aベストアンサー

> これでやると、それぞれの年の一覧ページの出力が出来ない

の意味が、各年がそれぞれの記事数の分だけダブってしまう、という意味なら、以下の部分、

-----------------------
unless($year == $last){push(@year_list,$year);}
else{$last = $year;}
-----------------------

を、

-----------------------
unless($year == $last){push(@year_list,$year);}
$last = $year;
-----------------------

というように変えれば良いと思います。
前者では、ブレークフラグ $last の更新タイミングがおかしい、つまり、unless の else で $last を更新するのでは、「$year と $last が同じだったときに $last に $year を格納」という、意味のない処理になってしまいます。
なので、毎回 $last を更新するか、push に続けて、つまり $year と $last が異なったとき更新すればいいと思います。
蛇足ですが、unless は混乱しやすいので、なるべくなら「if ($year != $last)」と書いた方がいいとおもいます。


以上でとりあえず年ごとの表示は可能になりますが、もっと効率の良い方法としては、「年別の記事一覧」をあらかじめテーブルにしてしまえば、その後の処理で楽に引き出せるようになります。
具体的には、たとえば以下のように、
-----------------------
foreach (@data) {
my ($doc_no, $year) = split(/,/);
if ($doc_table{$year}) {
push(@{$doc_table{$year}}, $doc_no);
} else {
$doc_table{$year} = [$doc_no];
}
}
-----------------------
こうしておくと、たとえば2002年の記事が欲しければ、
@{$doc_table{'2002'}}
という配列にすべて入っています。
一覧にするなら、たとえば以下の感じ。
-----------------------
foreach (sort keys(%doc_table)) {
print "$_ 年の記事は " . scalar(@{$doc_table{$_}}) . " 件あります。\n";
foreach (@{$doc_table{$_}}) {
print "No. $_\n";
}
print "-----\n";
}
-----------------------

さらにもっと進化させるなら、記事ごとの全データをまとめてハッシュのハッシュにしておけば、特定の記事が欲しい場合に、すぐに参照できます。
前述の「年別の記事一覧」と同時に作成するなら、たとえば以下のように。
-----------------------
foreach (@data) {
my ($doc_no, $year, $text) = split(/,/);
if ($doc_table{$year}) {
push(@{$doc_table{$year}}, $doc_no);
} else {
$doc_table{$year} = [$doc_no];
}
# ★ これを追加 ↓
$doc{$doc_no} = {year => $year, text => $text};
}
-----------------------
年と記事内容だけでなく著者や画像などもあれば、同様に追加。
こうしておくと、たとえば記事NO.5の「年」が欲しければ、
$doc{'5'}{'year'}
で、あるいは記事NO.3の「記事内容」が欲しければ、
$doc{'3'}{'text'}
というように参照できます。
先ほどの一覧を、これで表現すると、
-----------------------
foreach (sort keys(%doc_table)) {
print "$_ 年の記事は " . scalar(@{$doc_table{$_}}) . " 件あります。\n";
foreach (@{$doc_table{$_}}) {
print "No. $_ - " . $doc{$_}{'year'} . '年 - ' . $doc{$_}{'text'} . "\n";
}
print "-----\n";
}
-----------------------
これで、ご希望の各表示が可能と思います。

> これでやると、それぞれの年の一覧ページの出力が出来ない

の意味が、各年がそれぞれの記事数の分だけダブってしまう、という意味なら、以下の部分、

-----------------------
unless($year == $last){push(@year_list,$year);}
else{$last = $year;}
-----------------------

を、

-----------------------
unless($year == $last){push(@year_list,$year);}
$last = $year;
-----------------------

というように変えれば良いと思います。
前者では、ブレークフラグ $last の更新タイミ...続きを読む

QPerlプログラムでの足し算の表示

はじめまして。
先日プログラムの講義においてこのような課題が出たのですが解けなくて困っています。
分かる方いらっしゃいましたらよろしくおねがいします。

私Perlプログラム始めたての素人ですので、お手柔らかにお願いします。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
以下のように標準入力で整数を入力し、1から入力した数まですべての整数を足し合わせて表示するperlプログラムをfor文を用いて作りなさい。

Please type a number.

5

1+2+3+4+5=15
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

Aベストアンサー

ならば、まずは「繰り返し」「ループ」を覚えましょう。
for とか while とかです。
講義でやっているはずです。

Qperlでファイルを分割するプログラム

3Mを超える1つのテキストファイルに入っているデータある目印をもとに分割したいと思っています。分割ソフトをさがしたのですが見つけられませんでした(サイズで分割はありました)perlでテキスト処理ができると思い「テキスト処理とCGIのためのPerlプログラミング 伊藤 博康 (著) 」という本を借りてきたのですが、そのようなサンプルがなく1からperlを勉強する時間もないため、ここで質問させていただきました。ネット上にファイルを分割するperlのサンプルプログラムがありましたら教えてください。よろしくお願いします。

Aベストアンサー

 存在しません(^_^;
 簡単に「ある目印」と書かれていますが、その目印はプログラマーの数だけ種類があり、その目印の形によってはプログラム構造自体の変更が必要です。
 読者が欲しい目印の形を先読みしてプログラムを組むのは不可能です。

 どんな目印でしょうか?
 簡単な目印なら、ここにサンプルプログラムを書けるかもしれません。

Q以下のperlのプログラムについて教えて下さい。

次のプログラムは”多くのファイルの名前を一度に変更する”です。
(参考書から持ってきました)

perlの初心者、というよりパソコンの初心者で参考書等で調べても
わからないことが多く困っています。

#! /usr/bin/perl

$op = shift or die"Usage: rename expr [files]\n";
chomp(@ARGV = <STDIN>) unless @ARGV;
for (@ARGV) {
$was = $_;
eval $op;
die $@ if $@;
rename($was,$_) unless $was eq $_;
}

質問
1. opは何ですか?
2. Usageは何ですか?
3. exprは何ですか?
4. ARGVは何ですか?
5. evalは何ですか?
6. wasは何ですか?
7. eqは何ですか?
8. このプログラムにおいてファイルは
   どこのディレクトリでもリネーム出来るのでしょうか?
9. 出来ればプログラムの一行一行について説明をして下さい。

勉強不足で申し訳ありませんが、急ぎで知りたいので
宜しくお願い致します。

次のプログラムは”多くのファイルの名前を一度に変更する”です。
(参考書から持ってきました)

perlの初心者、というよりパソコンの初心者で参考書等で調べても
わからないことが多く困っています。

#! /usr/bin/perl

$op = shift or die"Usage: rename expr [files]\n";
chomp(@ARGV = <STDIN>) unless @ARGV;
for (@ARGV) {
$was = $_;
eval $op;
die $@ if $@;
rename($was,$_) unless $was eq $_;
}

質問
1. opは何ですか?
2. Usageは何ですか?
3. ex...続きを読む

Aベストアンサー

なぜ,急ぎなのですか?
> 9. 出来ればプログラムの一行一行について説明をして下さい。
急ぎなのにこれが必要な理由がちょっとわからない.

> 8. このプログラムにおいてファイルは
   どこのディレクトリでもリネーム出来るのでしょうか?

これは,試せばわかるはずです.
こんなところで聞くよりよっぽどはやいですよ.

------------------------------------------------------------
回答

以下はperlの基本です.

$から始まるものは変数名です.
@から始まるものは配列変数名です.
表示したいメッセージなど,特定の文字列は""で囲む.

質問 に対する回答

> 1. opは何ですか?
opという名前の変数.
op 自体はスクリプトの作者がかってにつけたので,
実はなんでもよい

> 2. Usageは何ですか?
”使い方”の意味の英単語.

> 3. exprは何ですか?
おそらく,何か適当な「式または表現」(expression) の意味.
一般的ではないが,コンピューター関係ではよく使われる略語.

> 4. ARGVは何ですか?
配列変数名だが,やや特殊な変数.
この場合は
@ARGV = <STDIN>
によって,キーボードなどから一行読み込み,
それが単語単位で分割され,@ARGVに代入される.

> 5. evalは何ですか?
「評価する」ためのコマンド.つまり,指定の文字列をコマンドとして実行する.
eval $op;
では,変数opに入っている文字列をコマンドとして実行する.?

> 6. wasは何ですか?
変数

> 7. eqは何ですか?
「等しい」を表す 演算子

> 8. このプログラムにおいてファイルは
   どこのディレクトリでもリネーム出来るのでしょうか?

できます.使い方は少し工夫がいるかもしれません.
ためしてみてできなかったら,
どのようなコンピューターで(Windows 98, UNIX 等),
どのように実行し,(コマンドプロンプトを開き,"rename xxxx xxxxと入力した"等)
どのような結果になったかという情報も書いてください.

> 9. 出来ればプログラムの一行一行について説明をして下さい。

#! /usr/bin/perl
実行開始時に,キーボードから入力した内容は記憶されている.


単語1 = rename
単語2= s/f/g/
単語3= f1.txt
単語4=f2.txt

$op = shift or die"Usage: rename expr [files]\n";

shift というコマンドを実行する.
実行できなかったら,
die"Usage: rename expr [files]\n"
を実行する.

shiftを実行すると,配列の内容がひとつずれる.
指定しなければ,@ARGV コマンド実行時に
キーボードから入力した内容がずらされれる.

単語1 = rename
単語2= s/f/g/
単語3= f1.txt
単語4=f2.txt

$was = $_;
 file名を変数wasに記憶しておく
eval $op;
 変数opをコマンドとして実行する.$_に対して,かなぁ
rename($was,$_) unless $was eq $_;
 変数"was"が変数"_"と 等しく なければ ファイル名を変更する.

あと,
chomp(@ARGV = <STDIN>) unless @ARGV;
for (@ARGV)
die $@ if $@;
が残ってますが,時間がないのでこのへんで失礼します.

急ぎの理由=レポートの課題の締め切りが連休明け
かなにかでしょうか.

がんばってください.
入門書を買いましょう.買ってあるなら,読みましょう.

なぜ,急ぎなのですか?
> 9. 出来ればプログラムの一行一行について説明をして下さい。
急ぎなのにこれが必要な理由がちょっとわからない.

> 8. このプログラムにおいてファイルは
   どこのディレクトリでもリネーム出来るのでしょうか?

これは,試せばわかるはずです.
こんなところで聞くよりよっぽどはやいですよ.

------------------------------------------------------------
回答

以下はperlの基本です.

$から始まるものは変数名です.
@から始まるものは配列変数名です...続きを読む


このカテゴリの人気Q&Aランキング

おすすめ情報