トップページphp
1001コメント343KB

【Perl】初心者コーナー Part13

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん02/05/30 13:06ID:R2kt1mTx
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。

1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。

CGIの質問は【CGIだけど、なんか質問ある? part 6】
http://pc.2ch.net/test/read.cgi/php/1019561283/
参考書籍の話題は【【Perl,CGI】参考書籍 第2版】
http://pc.2ch.net/test/read.cgi/php/988809842/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/
スクリプトの改造依頼は 【スクリプト改造工房 Part4】
http://pc.2ch.net/test/read.cgi/php/1012839651/

過去ログ、その他の役立ち情報は>>2-10あたりを見よう。
0003nobodyさん02/05/30 13:07ID:???
[総合]
 ・Perl Com: http://www.perl.com/pub/
 ・CPAN.com: http://search.cpan.org/
 ・ActivePerl: http://www.activestate.com/
 ・CGI-ML:http://forest.ne.jp/cgi-ml/

[お薦め]
 ・Perlメモ: http://www.din.or.jp/~ohzaki/perl.htm ★読んどけ
 ・Perl Recipes: http://www.effectiveperl.com/recipes/
 ・Randal's WebTechniques columns: http://www.stonehenge.com/merlyn/WebTechniques/
 ・Perlの部屋: http://www.cc.rim.or.jp/~midorin/mad-p/perl/index.html
 ・Perl初心者の部屋:http://www.harukaze.net/~mishima/perl/
 ・Perlリファレンス:http://www.big.or.jp/~mio/ga/pl/plref/pl_ref.htm
 ・Perlのページ:http://homepage1.nifty.com/nomenclator/perl/
0004nobodyさん02/05/30 13:08ID:???
[Document&Tutorial]
 ・Perl News: http://www.news.perl.org/
 ・Perl Monks: http://www.perlmonks.org/
 ・use Perl; : http://use.perl.org/
 ・Learn Perl - Perl Education: http://www.devdaily.com/perl/edu/index.shtml
 ・Perldoc.com: http://www.perldoc.com/
 ・Using Perl5 in Web: http://docs.rinet.ru/Using_Perl5_in_Web/
 ・Rex Swain's Home Page: http://www.rexswain.com/
 ・Robert's Perl Tutorial: http://www.netcat.co.uk/rob/perl/win32perltut.html
 ・Perl Tuts: http://savage.net.au/Perl-tutorials.html
 ・Beginning Perl Tutorials: http://www.pageresource.com/cgirec/index2.htm
 ・jcode.pl の私的な解説書: http://www.mikeneko.ne.jp/~lab/kcode/jcode.html
 ・Logical Choice Software, Home Page: http://www.logsoft.com/perltips/
 ・Perlfect Solutions: http://perlfect.com/
 ・The Perl Archive : http://www.perlarchive.com/
 ・Perl6 & Parrot VM についての情報: http://dev.perl.org/perl6/
 ・use Object; : http://perl.infoware.ne.jp/

[Module]
 ・Perl Module Reference: http://www.bekknet.ad.jp/~bero/docj/module_/
 ・PPMPackages: http://www.activestate.com/PPMPackages/
 ・河馬屋二千年堂's Page: http://member.nifty.ne.jp/hippo2000/index.htm

[Security]
 ・安全なプログラミングのためのガイドライン:http://www.FreeBSD.org/ja/security/#spg
 ・Perl security:http://www.perldoc.com/perl5.6/pod/perlsec.html
 ・Perl security和訳:http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlsec.html
 ・CGI and Security http://www.ansi.co.jp/tech/cgi/security/
 ・The Unofficial Web Hack FAQ:http://www.nmrc.org/faqs/www/
 ・How to Write Secure Code:http://www.shmoo.com/securecode/
 ・Safe CGI Programming :http://www.improving.org/paulp/cgi-security/safe-cgi.txt

[OS]
 ・Linux日本語マニュアル:http://www.linux.or.jp/JM/
 ・FreeBSD日本語マニュアル:http://www.jp.freebsd.org/man-jp/
0005 02/05/30 19:51ID:???
いまさらながら、乙>>1
しかしホント人いねーな。前スレ996でとまってるよ・・・1000ゲッターすらおらんのか
0006nobodyさん02/05/30 19:55ID:???
>5
悩める初心者がいないのは喜ばしい事と思おうじゃないか。

>1
おつ。
0007nobodyさん02/05/31 02:41ID:RZM1Qpf7
http://cgi2.osk.3web.ne.jp/~xxx/C-TALK/BOARD/SYNC-THINK/index.html
これってどっからみても2ch型掲示板なんだけど「he-ch_BBS Ver 0.51 (C)shun-K」
ってなっています。この人の自作なのでしょうか??
0008nobodyさん02/05/31 02:42ID:???
>>6
悩める初心者はいるが、それがperl(CGI/SSI)の分野とすら
判っていないという罠
0009nobodyさん02/05/31 11:17ID:/ptz9nSf
すみません duの出力をハッシュに格納する例で、
親ディレクトリ名キーに、子ディレクトリ名の配列のリファレンスを入れようとしています。
本中の例を見ていますが、どうしても一行解りません。

du hoge
1425 hoge/hoo
19 hoge/hoo/bee
58 hoge/raa

------プログラム途中より-------
($size, $name) = split;
$dirsize{$name} = $size;
($parent = $name) =~ s#/[^/]+$##; ←これ
push @{ $kids{$parent} }, $name;

矢印行は、どのような処理を行っているのでしょうか。
ヒントでも構いませんのでご指南いただけないでしょうか。
よろしくお願いいたします。
0010nobodyさん02/05/31 11:23ID:???
>>9
ヒント:

($parent = $name) =~ s#/[^/]+$##;

これは以下のコードとほぼ同じ

$parent = $name;
$patent =~ s/[^\/]+$//;
0011nobodyさん02/05/31 12:23ID:JMT5UavW
ActivePerlで、再帰的にすべてのフォルダにあるファイルを取り出す
ということをするために

use File::Find;

$dir = "C:\\windows";

find(\&print_dir, $dir);

sub print_dir {
  print $File::Find::name, "\n";
}

というrecurse.jplを実行すると、

syntax error at C:\Perl\lib/File/Find.pm line 2, near "use 5.005_64"
BEGIN failed--compilation aborted at recurse.jpl line 1.

というエラーが出ます。これはどういうことなんでしょうか。
↓はFind.pmの1行めから4行めまでです。

package File::Find;
use 5.005_64;
require Exporter;
require Cwd;

モジュールを使うのは初めてです。
どうぞよろしくお願いします。
0012nobodyさん02/05/31 13:22ID:???
Perlのバージョンが古いってことだす。
新鮮なPerlをインストールしてけろ。
00131102/05/31 13:40ID:JMT5UavW
>>12
どうもありがとうございます!
JperlじゃなくてPerlでやったら動きました。(Jperlが古いってことですよね。)
ホント助かりました。
0014nobodyさん02/05/31 13:55ID:9bWUYmPc
Accessで作成したデータベースファイルをLinuxサーバーに置いてWebからperlを使って操作ってことは可能でしょうか。
いろいろそういうモジュールがないかと探したんですけど見つけることができませんでした。何か方法があるんでしたら教えて下さい。
0015902/05/31 15:20ID:/ptz9nSf
>>10
うをー 
速やかなレスありがとうございました。感涙;;
0016nobodyさん02/05/31 15:50ID:n686HjoS
最近Perlでプログラムを始めてみました。
引数に文字列を入れたら、それぞれの文字のASCIIコードを足して、
10で割ったあまりを返すサブルーチンを作ったんですが、

#呼び出し
$moji = "ABC";
$number = &getid($moji);
print $number;

#ルーチン
sub getid{
 local($tmp) = @_;
 $id = 0;
 @data = split //,$tmp;
 $num = grep //,@data;

 for($i=0;$i<$num;$i++){
  $tmp = ord($data[$i]);
  $id += $tmp;
 }
 return $id %= 10 ;
}

ってやると、返り値が0の時のみ正常に動いて
それ以外の値になる時はこのルーチンの中でプログラムが終わってるようです。
何かヘンなところあるでしょうか?
00171602/05/31 16:09ID:???
すいません、他のルーチンに問題があったようです…
これで得た数値を、jcode.plを用いてSJISに変換しようとしたところで止まってたようです。
板を汚してしまい、申し訳ないです。
0018nobodyさん02/05/31 21:04ID:???
@list 内の $i 番目の要素を抜いて、一番最初にいれたいです。
どうすればいいか教えてください。

例:
$i = 2

●,◆,★,■,▲,▼
  ↓
★,●,◆,■,▲,▼
0019nobodyさん02/05/31 21:11ID:???
>>18
$i = 2;
unshift(@list,splice(@list,$i,1));
0020nobodyさん02/05/31 22:30ID:???
>>19
どうもありがとうございます。
0021nobodyさん02/06/01 05:07ID:???
PerlのTipsがたくさんおいてある、有名なHP教えてください。
よろしく
0022nobodyさん02/06/01 08:08ID:???
>21
>>3
002302/06/01 23:23ID:A+zARsIN
foreach $line (@qq) {
($a,$b,$c) = split(/<>/, $line);
if($a eq "abc") { ???????????? }
}
foreachで配列を処理します。$aが、abcだった場合、現在処理中の
配列のセット($a,$b,$c)ごと削除したいんです。
説明わかりにくくてすみませんが、どうすればいいですか?
0024nobodyさん02/06/01 23:29ID:???
>14
これ使って自分でモジュールを作れ。
http://www.vector.co.jp/soft/win95/util/se032901.html
0025nobodyさん02/06/01 23:58ID:???
>>23
delete
0026nobodyさん02/06/02 01:10ID:???
>>25
赤らくだ本によると、それだと連想配列が対象になるんじゃ?

splice とかは?
0027nobodyさん02/06/02 04:53ID:???
連想配列…久しい名だ。
そもそも、23ってwhileの方が…
それか
foreach(@qq){
($a,$b,$c) = split(/<>/, $line{$_});
~~~
0028nobodyさん02/06/02 05:50ID:???
>>27連想配列なら keys は要らないの?
0029もじら02/06/02 10:42ID:???
w2k + httpd + cgi_perl + DBI + posgre7.2 の質問です

DBIをどのように設定したらいいかわかりません
0030nobodyさん02/06/02 11:45ID:???
>>29
こんな投げ遣りな質問久しぶりだ。
君を第一級教えて君に認定しよう!
0031 02/06/02 11:48ID:???
>>29
どのように答えたらいいかわかりません
0032nobodyさん02/06/02 12:18ID:???
>>30-31
まぁまぁ。それが win 厨の特徴だから(藁
0033もじら02/06/02 14:24ID:???
自分でも把握してないので、やはり厨房ですケテー

接続ID = pg_connect("","","DB名");
これはPHPの中の記述です
この書き方は何に依存しているかは不明ですが
それでこの関数でエラーがでました

httpd とポスグレの状態は起動しています
どのように起動していればいいかは不明です
テーブルも作りました

ほんとに質問の仕方もわかりません
0034もじら02/06/02 14:30ID:???
仕組みがわからないのは、CGIとデータベースの間でのやりとりです
おそらくPERLからDB関数でカーソルを得てるとおもうのですが
DB関数はナニに依存しているのか、どこに組み込めばよいのか不明です
VBはOCXとODBCドライバを記述すればよかったのですが

VBでADOをさわったことはあるのですがカーソルは使えます

PERLがカーソル機能をもっているなら、関数を書けばいいだけなのか
不明です。

0035nobodyさん02/06/02 14:35ID:???
誰か>>33-34の翻訳キボン。このままじゃ読めん。
0036nobodyさん02/06/02 14:54ID:???
>>35
PHPだと>>33のようにすればできたけどPerlでDBとのやりとりを行うにはどうすればいいの
他の言語だと>>34のようにできたけど。
やるための準備はできているからPerlでの記述の仕方を教えて。

きっとこんな感じだろ。
0037もじら02/06/02 15:16ID:???
use DBI; # DBIモジュールを読込む
この書き方でDBIの関数を使える

これは正しいですか?

もし正しいなら、DBIモジュールはどこに組み込めばいいのかわかりません
DBIの概要は読みましたが、どこから入手してどこに組み込むのかわかりません

決してソースのキボンヌではないです
でもINSERT文のひとつが実行できたらミッション完了です

よろしくおねがいします
0038nobodyさん02/06/02 15:21ID:???
C compilerとmakeツールを用意してCPANへGO!
つーか「モジュールとはなにか」すら理解せずにDBIを使おうとするのは間違ってます。
0039nobodyさん02/06/02 17:14ID:QCpBS98O
全角文字を半角文字に変換したいのですが、過去ログを参考に
require 'jcode.pl';
jcode::convert(\$value, 'euc');
jcode::tr(\$value, '0-9A-Za-z', '0-9A-Za-z');
としてみたんですがsjisにしないと文字化けするため、上記のあとの行に
&jcode'convert(*value,'sjis');
をいれてみました。ですが全然変換されない状態です。
アドバイスあればお願いします。
0040nobodyさん02/06/02 17:23ID:QdZB4aXd
trとsはどこが違うんでしょうか?
00413902/06/02 17:31ID:QCpBS98O
ファイル文字コードをEUCで保存したらうまく変換されました。。
EUC以外の方法はないんでしょうか?
0042nobodyさん02/06/02 18:04ID:DhpOMnbM
質問です!!

リンクのCGIで入力項目を一つ増やしたのですが
ログに記録されません!
どこがおかしいのでしょうか?
http://nyanyanya.hoops.ne.jp/link.txt
増やした項目は bun ってゆーのです。
よろしくお願いします!!
0043もじら02/06/02 19:07ID:???
>>39
だからウィンユーザにmakeは不要なのです

私はウィンソック担当だからCGIのインタフェースを理解して
テスト環境を構築してるのです

手順だけわかればOKですので誰かつついてくれませんか?
0044nobodyさん02/06/02 19:28ID:???
>>39
シフトJISだとこうかなあ。
$_ = 'TBC個人情報3万件流出';
my @zenkaku = qw(
0 1 2 3 4 5 6 7 8 9
A B C D E F G H I J K L M
N O P Q R S T U V W X Y Z
a b c d e f g h i j k l m
n o p q r s t u v w x y z);
my @hankaku = ("\x30".."\x39","\x41".."\x5A","\x61".."\x7A");
my %table;
@table{@zenkaku} = @hankaku;
s/(\x82[\x4F-\x9A])/$table{$1}/g;
print;

>>40
trは文字単位の置き換え。
$str1 = $str2 = 'abc abz';
$str1 =~ tr/abc/ABC/d;
$str2 =~ s/abc/ABC/g;
print "str1: ",$str1,"\n"; # ABC ABz
print "str2: ",$str2,"\n"; # ABC abz

>>43
帰れ。
00453902/06/02 19:42ID:QCpBS98O
>>44 ありがとうございます。感謝です!
しかしすごいですねー。
0046nobodyさん02/06/02 21:18ID:???
もじらのコミニュケーション能力すげーな。採用担当者を尊敬するぞ。
0047nobodyさん02/06/02 21:25ID:???
my @hankaku = (0..9,'A'..'Z','a'..'z');
こうでよかったね。>>44のは関係ないのと混ぜちゃった。

00483902/06/02 21:49ID:QCpBS98O
わかったつもりだったんですがダメだぁコードの意味がわからないです。
>>44のTBCがRABに変換される仕組みを作ってるのは
s/(\x82[\x4F-\x9A])/$table{$1}/g; この一行だと思うんですが
どうしてこれだけで変な変換されるのかわからないです。
まともに変換するためにはどうすれば良いのでしょうか?
また、このコードはどうやって調べてるのでしょうか?
0049ぎもじら02/06/02 21:54ID:???
>>45
社会人やったらこんな質問氏ねーよ

なんてか、質問かえます、Perlにソケット関数備えてますか?

ヨロシコ

0050nobodyさん02/06/02 22:02ID:???
一番下のCGIの部分が、うまく表示できません。
http://www.bh.wakwak.com/~min/cgi-bin/monoceros.cgi
何がいけないんでしょうか・・・
お教えいただければ幸いです。
0051nobodyさん02/06/02 22:09ID:???
もしかしてスレ違い・・・申し訳ありません。間違えますた。
0052nobodyさん02/06/02 22:10ID:???
>49
ttp://tohoho.wakusei.ne.jp/wwwperl2.htm#socket

>50
配布CGIは配布元で聞くべし。
0053nobodyさん02/06/02 22:11ID:vJY+ySFU
フォームから数値を入れたPOST送信しました。
そのときのcgiが受け取った数値は文字列として受け取るの?
0054!02/06/02 22:23ID:0rr9HH/y
http://www.twin.ne.jp/~ackey/
0055nobodyさん02/06/02 22:28ID:???
>>48
うちだと上のままで動くから原因がわからん。
BCがABにずれるんなら、一文字ずれてるのかな。
コードは16進に変えてるだけ。検索すれ。

>>49
なんでさっきから一つズレてるの?
0056nobodyさん02/06/02 22:30ID:xW341CtX
>>53
YES
0057nobodyさん02/06/02 22:30ID:???
http://pc.2ch.net/test/read.cgi/php/1019561283/444
0058ぎもじら02/06/02 22:37ID:???
ごめんね、マルチで

でもわかりやすいHP情報助かりました
00593902/06/02 22:46ID:QCpBS98O
>>55 何度もありがとうございます。ようやくできました(TДT)
>>44のをコピペしたときに my @zenkaku = qw(のあとにつづく部分の
改行をとったんですが、そのときに半角スペースを削ってしまってました。
その影響でTBCがRABに変換されていたようで、うちの地元のTVニュース番組で
RABてのがあって、これはいったいどういうことだろう?と思い。。。
関係なくてすみません。とにかくありがとうございました。
0060nobodyさん02/06/02 23:32ID:???
なんにしろ解決したならいいさ。
0061nobodyさん02/06/03 00:08ID:450OcSEV
perl5.6で、perlmodを参考にモジュール(Mymod)を作ってテストしてます。
それで、10000行の入力でdprofppを使ってプロファイルを取ってみると、
Mymod::BEGINが10000-20000回の間で呼び出されていて、
定義していないはずのmain::BEGINも10000回前後呼ばれています。
perlmodには「BEGINは1回だけ呼ばれる」と書いてあったと思うんですが。
0062nobodyさん02/06/03 00:49ID:???

みなさん、
タカラ(およびコナミ)との『聖戦』が始まりました! これをコピペすれ!

コナミがタカラを買収! 黒幕はコナミか?
http://www.mainichi.co.jp/life/hobby/game/news/news/past/200004/20000427_03.html

株式会社タカラが、「ギコ猫」を商標出願中。 (,,?Д?) 我らのギコ猫を救え!
http://www2.ipdl.jpo.go.jp/BE0/index.html の商標検索から「ギコ猫」入力
=============開始==============
・広報コピペ部隊 できる限り各地にのニュースを伝える 例)タカラの株式スレなど
・テンプレ部隊 関連スレ・抗議文などのテンプレを作る
・法律部隊 法的に議論、打開策を考える
・誘導部隊 各地で出てくるであろう新参にいろいろ教えてあげる
・不買運動部隊 不買運動を広めよ
・株主・IR対策部隊 株価・株主・企業活動としてのPRやIRに対する対策

F5や単なる中傷は控えめに。正々堂々と戦うのだ。
0063nobodyさん02/06/03 04:44ID:zPDyt+6k
>>61
ソースみんとわからんけど。
BEGINブロックが複数あると、その数だけDProfはカウントするぞ。
あと「use Hoge;」は「BEGIN {require Hoge; import Hoge;}」に等しいから
useを使うごとにBEGINブロックが一個追加されることになる。
しかしカウント数が1万回にもなる理由はわからぬ。
0064nobodyさん02/06/03 10:16ID:9MQeJRCJ
log.datには5行データが書かれています。
cgiでデータを更新し、一番上(1行目)にデータを追加するのですが問題があります。
5行目のデータ(文字数)が長い場合、更新して新しいデータを追加したとき
古い五行目の余分なデータが新しい5行目のデータの最後に付いてしまっています。

open(FILE,"+<$filepath");
#処理は省略
pop @data;#6個目は削除
seek(FILE,0,0);
print FILE @data;
こんな感じでやってるのですが、最後のデータが大きいとデータが残ってしまいます。
どうやればいいのでしょうか。
0065nobodyさん02/06/03 11:12ID:???
>>64
seekする前にtruncate(FILE, 0);すれ。
00666402/06/03 11:27ID:???
ありがと!
できました。
そんな関数truncateがあったとは。
0067nobodyさん02/06/03 15:53ID:UUcyKeQx
$ほが=~ s/x/x\/g;
この方法で文字化けを回避しようするとエラーがでます。
エラーをださないようにするにはどうすれば?
0068nobodyさん02/06/03 15:56ID:???
>67
最初からeucを使う。
0069nobodyさん02/06/03 16:04ID:???
>>67
消えろ。
0070nobodyさん02/06/03 16:05ID:???
>>68
消えなさい。
0071nobodyさん02/06/03 17:27ID:???
Perlで質問なんですが、
@letters 内の、重複した要素を削除する方法を教えてください。
よろしくお願いします。
0072nobodyさん02/06/03 17:53ID:???
>>71
perldoc -q "remove duplicate"
で定石が出てくる
0073nobodyさん02/06/03 18:48ID:???
>72
すいません、よく意味が分かりません・・
もう少し詳しく教えていただけませんか?
0074nobodyさん02/06/03 19:00ID:???
>>71
%mita = ();
foreach $youso (@letters) {
push(@newletters, $youso) unless $mita{$youso}++;
}
0075プロのグラマー02/06/03 19:09ID:???
perlはsjisで書けよ。これ鉄則。
0076nobodyさん02/06/03 19:14ID:???
>>73
perlに必ず付いてくるperldocコマンドつーのがあってな。
シェルとかDOS窓のコマンドラインから>>72みたいのを入力するわけ。
すると-qの後に指定したキーワードに関するFAQが出てくる。

ただしキーワードは英語のみ。だから「重複した要素を削除」の
方法を知りたいなら「remove duplicate elements」で検索する。
0077nobodyさん02/06/03 20:16ID:???
>>75
鉄則というより、なにかの罰則ですねソレ。
0078nobodyさん02/06/03 21:58ID:wD1usRut
>>75
よく本を見ると、perlはeucで書けと書いてありますが、これはどういうことなのでしょうか。
私は秀丸で書いてるんですが、eucで保存すると、後で開いたときにすべて文字化けしてます。
「eucで書く」という行為自体がどうすることなのかよくわかりません。
みなさんeucで書かれてるんですか?
0079nobodyさん02/06/03 22:22ID:???
>>78
その他→動作環境→編集→文字コードの自動認識をする

サクラエディタでも使ってればぁ?(゚Д゚)
0080nobodyさん02/06/03 22:29ID:???
>>65,66
seek前にtruncateすると、printする前に異常終了した場合データが
吹っ飛ぶんで、print後にtruncateした方が良いと思う。
Cookbookのサンプルもそうなってるし。
seek(FILE,0,0);
print FILE @data;
truncate (FILE, tell(FILE));
close(FILE);
0081ぎもじら02/06/03 23:47ID:???
質問です

ポスグレのDBIいれようとしたら
c:\>ppm install DBI
でインストできちゃった

なんで?
どんな仕組みになってるのかわかりません

ヨロシコ
0082nobodyさん02/06/04 00:13ID:???
http://www.google.co.jp/search?q=%70%70%6D%82%C6%82%CD&hl=ja&lr=
分からない事があったらとりあえず検索するクセつければぁ?(゚Д゚)
0083ぎもじら02/06/04 01:04ID:???
>>82
すばらしい

ようやくPerlからポスグレ操作できるようになりました
あとはC言語から操作汁予定です

0084nobodyさん02/06/04 01:22ID:???
truncateってPerl4で使えないのかよっ!
0085nobodyさん02/06/04 08:43ID:???
奇怪な動作が起こってしまい、困っています。
Perlのバージョンは5.6.1です。
Text::Templateのバージョンは1.43です。

use Text::Template;
$NaviView = 'SHOW';
my $template = new Text::Template (
  'type' => 'FILE',
  'source' => 'test.html'
  ) or die;
print $template -> fill_in();

デスクトップでテストするとHTMLファイル内の{$NaviView}が展開されて表示されます。
しかし、cgi-bin/step8/フォルダ内だと、何故か{$NaviView}の部分が表示されません。
ソースは同じなので、原因がわからずに困っています。
どうか助けてください。
00866602/06/04 09:27ID:b8OuO/Ji
>>80
自分も調べてみたけど、そっちの方が安全性が高いみたいですね。
なんか、処理速度も速いみたいです。どうもです。
0087nobodyさん02/06/04 11:32ID:V54BnlXw
変数$Aの中に、$NO1.$NO2,$NO3・・・ という風に順番に数字を入れて処理を
繰り返したいのですがうまくいきません。どうか助けてください。変数の中に
変数というのは無理なんでしょうか?

for($m=1 ;$m <= 9 ; ++$m){
&print($m);
}
====================
sub print {
my ($i) = @_ ;
$A = "$NO$i";   #←この部分がやりたいことです
print = $A;
}

若輩者ですが、宜しくお願いします。
0088nobodyさん02/06/04 12:45ID:???
>>87
$A = "\$NO$i"; でいいのでは。って、こういうことじゃないのか?
ちなみにforの部分は、漏れはforeach(1..9)と書くのが好き。

0089nobodyさん02/06/04 12:49ID:???
>>87
ソフトリファレンスで $A = ${"NO$i"};
つーかハッシュ使えよ…
00906102/06/04 13:01ID:???
>>63
レスどうもでした。それと遅レスすいませんです。
tmon.outにはBEGINが数万回記録されていたのに、
BEGINにprint文を入れてみたら1回しか出力されなかったので、
DProfのバグということで落ちついてみます。
本当のところは知らないですが。
00918702/06/04 13:09ID:V54BnlXw
>>88さん >>89さん
どうも有難うございました。まだまだ勉強不足ですので頑張ります!
0092nobodyさん02/06/04 13:13ID:???
>88
過去スレで出たんだけど、foreachよりもforの方がいいらしい。
foreach(1..9)だと、@_ = (1,2.3,4,5,6,7,8,9);みたいな一時配列を作ってから処理をするからメモリを食うんだと。
まぁ、この程度の数値なら差はないだろうけど、
for($i=0;$i<10000;$i++)
foreach(0 .. 10000)
くらいになると差が出るんじゃないかな?
00936102/06/04 13:14ID:???
ちょっと追加。。。
#!/usr/bin/perl -w
use strict;
sub LIMIT { 10000 }
for (my $i = 0; $i < LIMIT; $i++) {
}
print "end\n";

このソースで下の測定結果になります。
Total Elapsed Time = 0.019991 Seconds
 User+System Time = 0.019991 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c Name
150.  0.030 0.025 10002  0.0000 0.0000 main::BEGIN
0.00  0.000 -0.000   1  0.0000   - strict::import
0.00  0.000 -0.000   1  0.0000   - strict::bits
0094nobodyさん02/06/04 13:42ID:???
>>92
過去のバージョンでは確かにそうだったが、
5.005の時点で最適化されたため、今や foreach(n .. m) の方が早い。
あやふやな知識は試してみてから外に出そうな。
0095nobodyさん02/06/04 13:52ID:???
>>92
それはPerl4とかの話でしょ。
今はもう一時配列作っていないから心配ないよ。
ちなみに0 .. 10000のほうが速い。ってperlsynに書いてある。
0096nobodyさん02/06/04 13:53ID:???
10分も経っているのにかぶった。スマソ。
0097nobodyさん02/06/04 13:54ID:???
>>93
すまんがわからん。さっぱりわからん。
俺も幾つか試してみたけど、まるで納得いかない結果になったよ。
多分どこかにバグがあるのは間違いないと思う。
0098nobodyさん02/06/04 14:12ID:???
>>93
5.6.0では

Total Elapsed Time = -0.85246 Seconds
User+System Time = 0 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c Name
0.00 0.575 0.105 10001 0.0001 0.0000 main::LIMIT
0.00 0.008 0.008 1 0.0077 0.0076 main::BEGIN
0.00 0.000 -0.000 1 0.0000 - strict::import
0.00 0.000 -0.000 1 0.0000 - strict::bits
Elapsed以外は正しく見えるが...

perltocにdprofpp(utility change)と書いてあるから古いの使ってるんじゃないのか?
00999702/06/04 14:22ID:???
>>98
俺のはPerl5.6.1(ActivePerl631) Devel::Dprof 20000000.00_00 だ。

このコードはどうだろう。
俺の環境では、なぜか use ...; をコメントアウトするとまともに動くのだが。

#!perl -w
use less; # strictとかでも同様。lessを選択したのは何の効果も無いプラグマだから

sub limit{ 100 }
sub LIMIT{ &limit }
for(my $i = 0; $i < LIMIT; $i++){}
0100nobodyさん02/06/04 14:30ID:???
>>97-98
レスどうもです。
ええと、perl -versionは5.6.1だったです。dprofppのバージョンは分かりませんでした。
SerioWare GNU/Linux 0.35A附属のものを使っています。

で、この環境では>>99と少し違って、
ちょうど>>94とかぶってたので、forとforeachを調べてみたら、
#!/usr/bin/perl -w
use strict;
for (my $i = 0; $i < 1000000; $i++) {
}
これだとBEGINは1回呼ばれるだけだったです。
0101nobodyさん02/06/04 14:45ID:???
>94-95
それは知らなかった、サンクス。

もっとも、漏れのプロバのスペースはいまだにPerl4なんだけどな。(涙ッシュ
01029802/06/04 14:50ID:???
>>99
ActivePerl 5.6.1でやってみた。結果は異常。

>>98はFreeBSD上の5.6.0。こいつのdprofppにActivePerlで作ったtmon.outを
食わせてみると、ActivePerlと結果同じ。 Devel::DProfのバグっぽい。
■ このスレッドは過去ログ倉庫に格納されています