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

【Perl】初心者コーナー Part12

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

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

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

CGIの質問は【CGIだけどなんか質問ある Pert 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を見よう。
 
0583nobodyさん02/05/10 04:06ID:???
>>581
print _STACK_DUMP_;

>>582
> perl Makefile.PL
> make
0584nobodyさん02/05/10 12:01ID:???
$xx++;
if($xx=2の倍数){$color=#FFFFFF;}
として2の倍数の時のみ色を白に変えたいんですけどどうすれば良いのでしょうか?
0585nobodyさん02/05/10 12:30ID:???
>>578
Googleサイトのマニュアルにある以上のことは無理。

>>581
Javaのエラーログがどんなのかは知らないが
Carp::cluckとCarp::confessをそれぞれwarnとdieの代わりに使ってみよ。
見当違いだったらすまそ。

>>582
ピュアPerlなんだな?*.xsっつーファイルはないんだな?
それなら@INCにあるフォルダに突っ込めばとりあえずは動く可能性がある。
環境変数PERL5LIBの意味も調べてみろ。
0586nobodyさん02/05/10 12:32ID:???
>>584

if($xx % 2){ .. }

これは「もし$xxが2で割り切れたら」と読む。
058758402/05/10 12:42ID:???
>>586
2で割り切れたら、、、。
すいませんありがとうございました。
2週間ぐらい考えてました。
0588数百のカテゴリ分け例を求む02/05/10 12:46ID:xN5d7c7l
>>587
SQLを使ってホームページの自動URLリンクプログラムを作っていますが、カテゴリー分けの作成に困っています。
数百程度に細かく分けたいのですが、自分で考えると偏りそうで。
カテゴリ分けサンプルなど参考になる文献やサイトはないでしょうか。
058958402/05/10 12:56ID:???
587でしょうか?
私でしたら2で割る数の求め方を知らなかった人間ですので、
ちょっと。
0590数十でもいいよ02/05/10 13:03ID:???
>>588 >>589
すみません。レスではありませんでした。
0591nobodyさん02/05/10 13:10ID:???
>>588
http://directory.google.co.jp/
http://www.yahoo.co.jp/
真っ先に思いつくこれらは参考にならんのだろうか
0592nobodyさん02/05/10 14:00ID:Pgg0tTKK
画像アップロードできる掲示板つくりたいんだけど、
やり方教えて・・・・。

0593nobodyさん02/05/10 14:31ID:???
>>592
作りたいものに近いcgiを落としてきてソース見て勉強しろ
0594nobodyさん02/05/10 14:52ID:???
>>586
「…割り切れなかったら」だべ。
0595nobodyさん02/05/10 14:54ID:Pgg0tTKK
>>593
http://sk.redbit.ne.jp/~tboard/cgiroom.html
ここの2番目のソースを見てみました。

どの辺がアップロードの処理なのか教えて・・・・・。
059658202/05/10 15:50ID:???
>>583
レスども、
tar.gzの中に、Makefile.PLが入ってないんですよ、
単に、*.pmファイルがあるだけで、
こういう場合どなんでしょ?
0597nobodyさん02/05/10 15:55ID:???
>>594
あっ…!

>>584
すまん、間違えた
「割り切れたら」は
if(($xx % 2) == 0){ ... }
だったわ。
0598数十でもいいよ02/05/10 16:37ID:mOuIPJt0
>>591
ありがとうございます。こちらはとてもよく構成されていると思いますが、どうも全体が見渡せません。
1ページ程度内にすべてのカテゴリーが一覧として載っていて全体がわかりやすいカテゴリーのリストを探しています。
0599nobodyさん02/05/10 16:57ID:???
>598
少しは努力しろよ
0600nobodyさん02/05/10 17:10ID:ZA7s2wmA
先生!漏れはバカなので本を見てもあまりよくわかりません
猿でも厨房でもわかるPerlの基礎について学べる
サイトを教えてください。(3にあるお薦めも難しいです・・・
0601nobodyさん02/05/10 17:40ID:???
(´-`).。oO(>>600 3にあるお薦めも駄目なら、逝ってヨシ…)

「プログラミング」という行為、学習で perl が初めてなら、
先ず、javascript 辺りから始める事をお薦めします。
perl はある程度他の言語の「プログラミング」経験が
ある人じゃないと、いきなり学習するのは辛いかと…
0602nobodyさん02/05/10 18:39ID:???
C++とPerlとJavaScriptをまとめて開きながら交互に作業してます。
ついつい文法がごっちゃになってエラー出してしまうオイラは逝ってよしですか?
0603nobodyさん02/05/10 18:58ID:Pgg0tTKK
     ____ 
     ◎;;;; ・∀・;;;) チクーワ
      ̄ ̄ ̄ ̄
0604nobodyさん02/05/10 21:05ID:DbBvL4ha
サンプルなどから作ったCGIなんですけど、
テストで10回に3回ほどサーバーが強制終了されてしまいます。
何がいけないのか教えてください。

ソースは
http://members.home.ne.jp/y-koike/bbs.txt
http://members.home.ne.jp/y-koike/show.txt
です。お願いします。
0605nobodyさん02/05/10 21:22ID:???
>>604
環境が全くわからずに答えろってか。
060660402/05/10 21:39ID:DbBvL4ha
…すみません。慌てて書き忘れました。
Win2000でhttpdVer.1.39f、PerlはActivePerlです。
0607nobodyさん02/05/10 21:53ID:/cNgrcGu
◎;;;; ・∀・;;;) チクーワ (・∀・)イイ!
0608nobodyさん02/05/10 22:39ID:???
>>604
ざっと見たが、とりあえずまともに動くコードには見えない。
だがサーバーが落ちるような原因は見当たらないな。
常に落ちるってのならともかく3/10じゃお手上げだ。

ついでに余計なおせっかいだが、
そのサンプルは相当な糞コードだな。
まともな本で勉強したほうがいいぞ。
060960402/05/10 23:06ID:DbBvL4ha
どうもありがとうございます。
やっぱサンプルから横着しないで一から自作だな…
0610nobodyさん02/05/11 02:07ID:qFv6V9OI
Perlだけで実現できる、SQL型データベースのモジュールって
無いですか?
0611nobodyさん02/05/11 05:07ID:???
use Psql;
0612nobodyさん02/05/11 08:42ID:gbNCX/hH
#!/usr/bin/perl

$hoge = "head:abc.abc.abc.def";

print "Before: $hoge\n";
$hoge =~ s/(head:)(abc\.)(.?)/$1$3/g;
print "After : $hoge\n";

このコードで、期待する結果として $hoge には head:def が
最終的に入るようにしたいのですが、やはり s/ の部分を
while で括るしかないのでしょうか?

$hoge =~ s/(head:)(abc\.)(.?)/$1$3/g;

$3 のところの特殊変数で「マッチしなかった文字列」なんて
あるわけないですよね…特定できないし…
0613nobodyさん02/05/11 09:56ID:???
>>612
どのフィールドが固定なのか条件をはっきりしやがれ。
0614nobodyさん02/05/11 11:21ID:???
>>612
まずは perlretut でも読め。繰り返し指定と ? の効果を調べろ。めちゃくちゃだ。
0615nobodyさん02/05/11 12:09ID:???
>>612
その場合なら普通に
$hoge =~ s/(head:).*(def)/$1$3/;
これでいいんじゃないの。
0616nobodyさん02/05/11 13:37ID:7MEyepY2
KENTさんの「自宅サーバー化計画」を見たのですが
CGIの動作を確認するならやはりこのように
オフラインでテストできるようにした方がいいのでしょうか?
0617nobodyさん02/05/11 13:51ID:???
>>616
俺はローカルテスト一切しないな。経験的にほぼ動作見切れるから。
0618nobodyさん02/05/11 14:08ID:???
>>616
当然。自分のサーバならともかく、人様のサーバでテストする奴は迷惑馬鹿。
0619nobodyさん02/05/11 14:29ID:???
んじゃ>>617は迷惑馬鹿ってことで。
0620nobodyさん02/05/11 15:07ID:???
>>616
バグの収束性は確実に早い。
0621 02/05/11 15:55ID:???
>>616
俺もやるな。
あぷする手間も省けるし。
0622nobodyさん02/05/11 17:28ID:???
経験的にほぼ動作見切れてる>>617が妄言を吐いているスレはここレスか?(藁
062361202/05/11 17:45ID:???
すんません。>>613 >>614 の言っている事が初心の俺には解りません

文字列の "head:" と "abc." は固定です。"head:" は必ず、行頭に
1回しか出てきませんが、"abc." は色んなところで複数回出てきます。
"def" は固定ではないので >>615 の場合だと、"def" 以外の時は
機能しなくなってしまいます
0624nobodyさん02/05/11 18:03ID:???
>>623
勉強する気は無いんかと。()でグルーピングして * とか + とか {m,n} とか知らんのかと。
$hoge =~ s/(?:abc\.)+//;
0625nobodyさん02/05/11 18:54ID:???
>>619
動作見切れて何故迷惑馬鹿?
0626nobodyさん02/05/11 18:59ID:???
>>622
小さいなあ。
君のような弱小レベルでは妄言に見えるけどそういうレベルの
人間も世の中には確実にいるのだよ(藁
0627nobodyさん02/05/11 19:19ID:???
617=625=626 ( ´,_ゝ`)プッ
0628しょぼいSE02/05/11 19:32ID:QCHMLNRj
2chらしい掲示板にマジ質問ですまん。
他人様のホームページをインラインフレームで表示するときに、表示した他人様のページのスクロールバーを消す方法ってある?
CGIでできるかと思ったけど、方法がわからん(−−;
0629nobodyさん02/05/11 19:49ID:???
>>622 設定ファイル書いて「このプログラムも完璧に動いた、俺って天才」つーてるんだよ。
そういう世界もある事をわかってやれ。
063061202/05/11 19:51ID:???
>>624
> 勉強する気は無いんかと。()でグルーピングして * とか + とか {m,n} とか知らんのかと。

ありがとうございます。ほとんど昨日、今日perl始めたばっかりの房なので…
() って、$1 とかに突っ込む以外にも効果あるんですね。
?: が無くても期待する結果が同じなのが謎なのでその辺を自分で勉強します
0631nobodyさん02/05/11 20:19ID:???
>>625
完璧に見切れます、というのならともかく「ほぼ」じゃダメだろ。
そもそも完璧じゃなさそうなのだが。まあ>>629が真実なんだろうな。
0632nobodyさん02/05/11 20:23ID:???
>>628
それはHTMLとかCSSの仕事。
HTMLならscrolling="no"、CSSならoverflow: hidden;あたり。Web製作板へGO。
0633nobodyさん02/05/11 21:42ID:???
>>617が馬鹿だってことは、経験的にほぼ見切れる俺。
063461602/05/11 22:28ID:???
とりあえずオフラインでも動くようにしてみます。ありがとでした。
0635nobodyさん02/05/12 00:32ID:Kq9I9f0M
perlで指定した文字数でランダムな英数字の文字列を生成するには
どうすればいいのでしょうか?
おしえてください。
0636nobodyさん02/05/12 00:38ID:???
>>635
範囲を決めてrand()とchr()で。
0637nobodyさん02/05/12 00:39ID:???
最近教えてスレッドとか改造スレッドみたい、ここ。

6文字で。
my @word = (0..9,'a'..'z','A'..'Z');
my $rand = '';
$rand .= $word[int rand @word] for (1..6);
0638nobodyさん02/05/12 00:43ID:???
>>636-637
できました!
どうもありがとうございます。
0639nobodyさん02/05/12 00:47ID:???
教えて!!!!!
0640nobodyさん02/05/12 01:15ID:???
>>639
や!!!!!
0641パルお02/05/12 01:40ID:eZiXZjwU
LPWモジュールでクッキーを受け取るにはどういう風に記述すればいいのでしょうか?
0642nobodyさん02/05/12 02:08ID:???
>>637 禿同。時々>>1を引用しておいた方がいいんじゃないか?

>いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。
>
>1:自分はこう言う事がしたい。
>2:それでこんな風にやってみたが・・・
>3:それだとこんなエラーが出て上手く行かなかった。
>
>1と3が無いと誰も答えられないよ、良い回答は良い質問から。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
というわけで>>641 2:3:が無いよ、と言わせてもらって >>4に載ってるここ見た?
http://member.nifty.ne.jp/hippo2000/perltips/lwpcook.html#COOKIES
0643nobodyさん02/05/12 03:52ID:???
chr に 2byte 以上与えた場合の戻り値の規則を知りたいのですが、
my $num = shift;
print "$num => ", unpack("C*", chr($num)), "\n";

255 => 255
256 => 196128
257 => 196129

なんでこうなるの?
0644nobodyさん02/05/12 14:08ID:9L9P3cqp
Perlのスクリプトが動かないのです。
use Any〜でのデータベース使用の準備の後、
dbmopen〜|die〜;
tie〜|die〜;
の両方が死にます。
WindowsMeではパーミッション666のDBMデータベース使えないのでしょうか?
それともPerl5を入れれば改善されるのでしょうか?
激しく既出だとは思うのですが…
0645nobodyさん02/05/12 14:56ID:???
>>644
がいしゅつ以前の問題だろ…。
何でも良いからマニュアルの演算子の項を見れ。
ちなみに、それだとあらゆるプラットフォームで確実に死ぬ。
064664502/05/12 14:59ID:???
つーかPerl4なのか。
それならそもそもuseをした時点で死ぬだろ。
0647nobodyさん02/05/12 16:08ID:4Ko6xKbI
windows2000Pro.+apacheでCGIを組んでいるのですが、腕の未熟もあって
たまに無限ループを作ってしまうことがあります。
その時にPerl.exeを強制終了させたいのですが、タスクマネージャから落とそうとすると
アクセスが拒否されて落とす事が出来ません。
再起動すれば問題無いのですが、煩雑ですし、Perl.exeが走ったままで使いつづけるのも怖いので
解決方法があればお教え願いたいです。
064864402/05/12 16:26ID:???
>>645
すみません。|演算子は||の書き込みミスです。
Perlは5かもしれません。よく分かりません。
一応、がんばって自力で途中まで調べました…。
use DB_File;
はどうなんでしょう?とりあえず帰ったら試してみます。
これでだめだったらどうしよう…。
0649nobodyさん02/05/12 16:40ID:???
>>648
ハァ…自分が何やってるのかもわからないヤシに何かを教えることは出来ません。
065066402/05/12 16:46ID:???
>>649
何をやっているか…標準クラスモジュールのスコープを使用可能にしているのでは?
Perlは5でした。結局、tieが通らないのが問題だと思います。
Perl附属データベースを優先的に使用するように指定できれば良いのでは…
と思ってはいるのですが…やりかたが…
0651nobodyさん02/05/12 17:28ID:???
>650
やっぱり何やってるかわかってないじゃん。

つーか、「〜すれば良いのでは?」と思うなら勝手にそうしてください。
やり方がわからないならGoogleってください。
ここはあなたに相槌を打つスレじゃないので。


0652nobodyさん02/05/12 20:41ID:???
携帯でgoogleか…鬱だ…
0653nobodyさん02/05/12 22:30ID:???
駱駝本と格闘して自己解決しました。GDBM_Fileとtieの組み合わせで成功。他の方法で失敗する原因は後で考えますです。
0654nobodyさん02/05/12 23:20ID:???
>>643
unpackは1Byteずつ処理。
どうもリストコンテキストで評価されてそんな数字になっているみたいだね。
chrはUTF-8の文字列を返しているみたいだけど… 詳しい方、解説キボン。

my $num = 256;
print "$num => ", join ', ', unpack("C*", chr $num), "\n";
print "$num => ", ord chr $num, "\n"; # chrの反対はord
0655nobodyさん02/05/13 07:46ID:???
どうでもいい事だとは思うけど、コーディングしてて山の様にあっちこっちに
動的変数作ってしまって、プログラム終了まで使われなくなった変数って
やっぱシステムリソース喰ったままなんですかね?

「もう、この変数は使わない〜」と思ったら、undef した方がいいの?
それとも、コンパイラが適当に判断してくれたりするんだろうか?

$a = "(・v・)";
$b = 12345;

{
# ここで $a と $b 使う。これ以降は使用されない
}

{
# 新たに変数 $c を割り当てる。しかし、$a $b が使われていないので
# $a $b 用の領域を使って確保される?(暗黙の undef とか?…)
$c = "( ゚д゚)";
}
0656nobodyさん02/05/13 07:58ID:???
素人のものすごい素朴な質問なんですけども、
-wとuse strict;とuse warnings;$|=1;も入れて可能な限りエラーをなくして見たりしてるんですが
なぜか
Use of uninitialized value in concatenation (.) or string at C:\***.cgi line n.
と
Use of uninitialized value in string eq(またはneとか==とか!=とか。) at C:\***.cgi line n.
というエラーは消えてくれません。
動作にはまったくこれといって支障ないですけど、なんとなく気になってた疑問なのでちょっと聞いてみました。
0657nobodyさん02/05/13 10:50ID:???
>>656
理由はメッセージに書いてあるじゃないか。変数は初期化しろ。
とわいえ、俺もこのwarningはウザイと思う場合もある。そん時はno warnings;〜;use warnings;ではさむ。
0658nobodyさん02/05/13 13:13ID:???
>>655
myしる。そうすればブロック抜けた時に消える。

{
my $c = '( ゚д゚)';
# 〜$cを使う処理〜
}
0659nobodyさん02/05/13 16:13ID:e7rLHiwb
比較結果の表示と保存をするのに

my $patch = system("diff file1 file2");
system ("diff file1 file2 >patch.diff");
print qq|$patch\n|;

これをまとめるのはどのようにしたらよろしいのでしょうか?

my $patch = system("diff file1 file2 >patch.diff");
print qq|$patch\n|;
では表示が 256 になってしまうので宜しくお願いします。
0660nobodyさん02/05/13 20:22ID:???
>>659
何がしたいのか分からないのでこの答えが妥当かどうかはわかりませんが
$patch = `diff file1 file2`;
066165602/05/13 21:29ID:???
>>657
変数のところじゃなくて、
Use of uninitialized value in concatenation (.) or string at C:\***.cgi line n.
が出るのは
print <<"EOF";
の行なんです。これを指摘されるのは何でなんでしょう?
print <<"EOF";
〜
EOF
内で使われる変数は全部use var qw[$a $b 〜];というふうにあらかじめ書いてるんでが。
ヒアドキュメントになにか決まりごとでもあるんでしょうか?
0662nobodyさん02/05/13 21:47ID:???
>>661
宣言と初期化は違う。
宣言しただけだと変数の中身はundefだから、そんな感じで怒られる。
初期化(空文字列を代入するとか)をしておけばエラーは出なくなる。
066365602/05/13 22:55ID:???
>>662 ども。
use strict;
use var qw[$a $b 〜$z];
$a=$b=$c=〜$z="";

{
print <<"EOF";
〜
$a
$b 〜
$z
EOF
}

とやってみましたが、やっぱりprint <<"EOF"; を指摘されます。別に問題なく動くということは
print <<"EOF";で出るUse of uninitialized value in concatenation (.) or string at C:\***.cgi line n.は
やっぱり意味の無いエラーなんでしょうか。
0664nobodyさん02/05/13 22:56ID:S5I/8Zh9
perlでオラクルを使ってDBIのモジュールをインストして使ってます。

selectall_arryとかで値を抜き出す時に使う変数が理解不能です。
$@hogehoge とか $$_[1] って奴です
一応$_[1]とかは解りますが$@を会わせたり$$でjobid以外の使い方が今いち理解できません。
0665nobodyさん02/05/13 23:03ID:???
>>663
んな事はない。どれかの変数の初期化を忘れているだけだ。
目を皿にして良〜く見ろ。
0666nobodyさん02/05/13 23:13ID:???
>>660 ありがとうございました。以下で解決しました。
$patch = `diff file1 file2`;
open (FH, ">patch.diff");
print qq|$patch|;
print FH qq|$patch|;

0667nobodyさん02/05/13 23:22ID:???
>>664
man perlref
0668nobodyさん02/05/13 23:30ID:???
>>663
途中で変数にundefが代入されたんだろう。
試しにprint文の直前でprintに関わる全ての変数に対して defined $z or $z = ''; してみれ。
0669nobodyさん02/05/14 00:14ID:ZpKcImQq
古くなった掲示板の投稿を次々とHTMLページにして過去ログを作成する掲示板がありますが、
1ディレクトリ内のファイル数が多くなるとアクセスが重くなったり、サーバーに問題が起きたりするのでしょうか。
サーバーはファイルにアクセスするときに1ディレクトリずつ辿っていくとするなら遅くなりそうですが。
5000ファイルとかでも大丈夫でしょうか。
0670nobodyさん02/05/14 00:21ID:???
Perl5で掲示板CGIを作っているのですが、CGIの”重さ”ってどうやって調べればよいのでしょうか。
WinソフトならCPU使用率のグラフでも見ればいいんですが、サーバ上となると。

CGIスレで聞こうと思ったんですが、言語に依存しそうなのでこちらでよろしいですか?
0671nobodyさん02/05/14 00:26ID:i98930LO
よく見るとsageだったスマソ
0672nobodyさん02/05/14 00:39ID:o5LDH6aT
>>670
-d:DProf とか。

CGIなら
#!/usr/bin/perl -d:DProf
とかで。
067367002/05/14 00:55ID:???
あの…それってなんのオプションですか?(今調べてますが)
CGIのほうではエラーで起動できず、DOSプロンプト(WinME+Apache)のほうではなにも表示せず終了なのですが。
067467002/05/14 01:04ID:???
あ、なんか出てきた。
ありがとうございましたm(_ _)m

…と言っても、そんなファイルは見つからない〜のw。
0675nobodyさん02/05/14 01:21ID:???
>>658
Perl内部ではメモリ開放されるだろうけど、OSには返されないだろ、
ってクックブックに書いて有ったきがする。つ〜わけで、システム
リソースは喰ったまま。スクリプトが終了した時点で全て回収
される。
ただmyを使用すれば、新たな変数宣言時に跡地が有効利用されて、
全体としてメモリ使用量が減る、ってことになるんですかね。
067665602/05/14 02:11ID:???
>>665
>>668 どうもです。
とりあえずそれをやってみます。
undefってやっぱりPOSTから分解したときに対応している値が空だとundefが入っちゃうんでしょうか?
***.cgi?a=&b=123だと$a=$FORM{'a'};は中身はundefなのか''空なのかどっちになってるのかよくわかってないです。。
0677nobodyさん02/05/14 03:03ID:???
>>676
>POSTから分解したときに対応している値が空
その場合はundefじゃないと思うよ(空)。分からない時は
defined $FORM{'a'} ? print "定義済み〜\n" : print "未定義〜\n";
しちゃえば?

>>672
質問した者では無いんですが、良い事を教わりました。
0678nobodyさん02/05/14 09:12ID:???
とりあえず *無意味なエラー* なんてものは存在しないってことを理解しる
0679nobodyさん02/05/14 09:34ID:???
>>678
なんか当たり前だがハッとなる言葉だな。
0680nobodyさん02/05/14 11:32ID:???
糞ッたれなエラーメッセージは世の中に溢れている。
abnormal termination...
0681nobodyさん02/05/14 13:14ID:???
-d:DProf について解説してるサイトないですか?
0682nobodyさん02/05/14 14:04ID:???
>>681
http://www.perldoc.com
■ このスレッドは過去ログ倉庫に格納されています