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

Perlコーディング初心者質問スレ Part 46

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2006/01/18(水) 02:17:46ID:???
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

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

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
0478nobodyさん2006/02/07(火) 13:44:22ID:???
>>477
いや、
>Can't locate bigint.pm
のところが問題なんじゃないのか?
0479nobodyさん2006/02/07(火) 14:04:11ID:???
回答者も初心者かよ
いい加減にしろよ
0480nobodyさん2006/02/07(火) 14:26:12ID:???
anhttpdはCGIの動作は怪しいからapache入れた方がいい
それかコンソールで確認するか…
0481nobodyさん2006/02/07(火) 14:33:11ID:???
アクティブパールでローカル上でcgiを走らせているんですが、
require "./jisaku.pl";
などファイルをインクルードする文を実行する命令を付け足すと、画面が真っ白になってどうにもなりません。
require命令を消して実行すると上手くいきますが、
どうしてもファイルを分割してコーディングしたいです。
どうにかなりませんか。
0482nobodyさん2006/02/07(火) 14:36:58ID:???
jisaku.plから呼び出し元の関数呼んでたり、無い関数を呼んでたりしてない?
04834812006/02/07(火) 14:50:54ID:???
>>482
してません。
私は、新しく作るサブルーチンは全てメインファイルに記述し、
動作確認ができてから分割するという習慣をとっていますし、
jisaku.plから呼び出し元の関数を呼んでいたりはしません。

で、気づいたんですが、kentwebさんのlight.cgiを見てみると
require命令にシングルクォートを使っているので、もしかしたらダブルクォートを使ったのが
いけなかったんじゃないか・・・と思います。
でももうコーディングする時間がないので誰か誰かあああぁぁぁぁぁん。
0484nobodyさん2006/02/07(火) 15:04:53ID:???
とりあえずログ晒せよ
0485nobodyさん2006/02/07(火) 15:35:07ID:???
>>483
jisaku.plが真を返してないとか。
jisaku.plの最後に1;って書いてみ
0486nobodyさん2006/02/07(火) 15:35:38ID:???
>>429
ツリーって下から考えたら楽じゃね?

my @data = reverse <DATA>;
my (@tree, @rule, $depth);
foreach (@data) {
/^( *)(.+)/;
$#rule = $depth = length($1);
$rule[$_] = !!$rule[$_] for 0 .. $depth-1;
$rule[$depth] = 2 + !$rule[$depth];
unshift @tree, join '', (' ','│','├','└')[@rule], $2, "\n";
}
print @tree;
0487nobodyさん2006/02/07(火) 15:50:34ID:???
>>476
bigint プラグマが用意されたのは 5.8.0 から。
http://search.cpan.org/~nwclark/perl-5.8.8/pod/perl58delta.pod#New_Modules_and_Pragmata

Math::Bigint の使い方はドキュメントを。
http://search.cpan.org/~tels/Math-BigInt-1.77/lib/Math/BigInt.pm

>>481
君のスクリプトの二行目に
use CGI::Carp qw(fatalsToBrowser);
を挿入し、出てきたエラーメッセージを読んで解決なさいな。
http://perldoc.jp/docs/modules/CGI.pm-2.89/CGI/Carp.pod
http://search.cpan.org/~nwclark/perl-5.8.8/pod/perldiag.pod
http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item_require_EXPR
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perldata.html#Scalar_value_constructors
0488nobodyさん2006/02/07(火) 16:22:17ID:???
楽しい初心者サークルでつね。
0489nobodyさん2006/02/07(火) 16:24:47ID:???
自分のスクリプト否定されたからって「〜でつね」とか書くな
0490nobodyさん2006/02/07(火) 20:42:51ID:???
perlの解説書読むと、日本語とか、ちゃんとUTF8でエンコードしてやり取りしなさい
って書いてあるんだけど、そんなことしなくてもちゃんと動くし最後のhtml出力でシフトJISに指定やれば
問題なく表示されますよね。
なんかやるメリットってあるんでしょうか?
0491nobodyさん2006/02/07(火) 20:48:18ID:???
>>490
それなんて解説書?
0492nobodyさん2006/02/07(火) 20:52:59ID:???
>>491
ハーシー 速攻図解プログラミング Perl/cGI
です。
0493nobodyさん2006/02/07(火) 20:57:09ID:???
まあ別にUTF-8に越した事はないが・・
0494nobodyさん2006/02/07(火) 21:03:41ID:???
>>490
起き得る不都合とその回避方法を把握しているなら、別にどの
文字コードでスクリプトを書こうが問題無い。

ただ、今の perl は UTF-8 を前提に動いているし、UTF-8 なら
Shift_JIS を直接扱う時のように ASCII とのバッティングが起こら
ないし、EUC-JP は日本ローカルな文字コードであるのに対し
UTF-8 は世界的に使われている文字コードなので、まだ UTF-8
の認知度が低かった数年前ならともかく、現時点でこれら3つの
中から選ぶなら UTF-8 が「無難な選択」になる。
0495nobodyさん2006/02/07(火) 21:15:58ID:???
utf8前提だったら、use utf8なんてなくなってるよ。
テキスト処理で速度が必要な場合は、その文字コード用に
コード書いた方が断然よい。前にJISのテキスト処理をutf8で
やったら、変換に時間かかりすぎて使い物にならなかった。
0496nobodyさん2006/02/07(火) 22:07:16ID:???
> テキスト処理で速度が必要な場合は、その文字コード用に
> コード書いた方が断然よい。

> 前にJISのテキスト処理をutf8で
> やったら、変換に時間かかりすぎて使い物にならなかった。

頭大丈夫?
0497nobodyさん2006/02/07(火) 23:33:23ID:???
メール送信フォームを作っています。

#名前
<tr>
<td class=r align=right width=110>名前 <font color=red>※</font></td>
<td class=r width=440>
<input type=text name=name size=30 style='ime-mode:active' value="$cnam"></td>
</tr>


# 項目1
print "<input type=radio name=hoge value=\"A\" checked>A \n";
print "<input type=radio name=hoge value=\"B\">B \n";


リターンメールで
$mbody .= "名 前 = $in{'name'}\n";
はメールの本文にちゃんと出るのに

$mbody .= "項目1 = $in{'hoge'}\n";
は表示されません。。

考えられるミスがわかる方ご指摘お願いいたしまするー
0498nobodyさん2006/02/07(火) 23:44:44ID:???
端折ってソースさらしてるのは「お前らエスパーなんだろ?読みとれや」ってことですか?
0499nobodyさん2006/02/07(火) 23:49:25ID:???
答えられる人はいないのですか?
0500nobodyさん2006/02/07(火) 23:57:58ID:???
>>497
> 考えられるミスがわかる方ご指摘お願いいたしまするー
考えられる可能性は1つしかない

> $mbody .= "名 前 = $in{'name'}\n";

とエディタで書いた後でソースを保存したが

> $mbody .= "項目1 = $in{'hoge'}\n";

と書いた後でまだ保存してない。
0501nobodyさん2006/02/08(水) 00:21:10ID:???
$in{'hoge'} の中身を print するなりしてちゃんと確かめてみるが良かろう
0502nobodyさん2006/02/08(水) 01:09:27ID:???
両方チェックOnすると hoge って name で2つPOSTされるね。
$in{'hoge'}にABとでも入ってほしいのかの。
フォームのデコード処理が甘いと空になっちゃうかもね。
05034972006/02/08(水) 01:15:50ID:???
あげてみますた。

http://s1.muryo-de.etowns.net/~testjoy/order.txt

これの # 配達方法 が メールで返ってきたときに空白なんですよ。。
なぜかしら?
0504nobodyさん2006/02/08(水) 01:48:32ID:???
>>503
init.cgi が見れないと分からん。
以後は下のスレにでも移動してくれ。

自分の作ったCGIスクリプトをデバッグするスレ
http://pc8.2ch.net/test/read.cgi/php/1011174442/
0505nobodyさん2006/02/08(水) 01:57:25ID:???
BASIC レベルのウンコスクリプトを書く人と、
モジュールわんさかのスクリプトを書く人の
2種類しかいない Perl 界隈。
0506nobodyさん2006/02/08(水) 02:03:33ID:???
前者はともかくとして、後者は何か問題なのか?
0507nobodyさん2006/02/08(水) 02:19:56ID:???
モジュールを再発明する人も含めて3種類。
0508nobodyさん2006/02/08(水) 02:51:38ID:???
二極化している、と言いたいんじゃないか?
0509nobodyさん2006/02/08(水) 03:17:07ID:???
広告挿入されまくりでソースがファオアフォになってるw
0510nobodyさん2006/02/08(水) 04:20:34ID:???
>>508
どこで差がついちゃうのか、何が分かれ目になるんだろうねえ?
0511nobodyさん2006/02/08(水) 04:34:41ID:???
あるものは使え(中身が分からなくても動くならOK)
コピペしてでも自分のソースに必要最小限だけしか入れたくない

じゃないのかな
0512nobodyさん2006/02/08(水) 22:25:24ID:VDqpPhRj
任意の時間(単位=秒)をフォームに入力、
それを年、月、日、時、分、秒 で返したいんですがどのようにするといいですか?



0513nobodyさん2006/02/08(水) 22:28:04ID:???
>>512
秒っていつからの秒だよ
とりあえず

■こんなCGI作ってください■ Part.2
http://pc8.2ch.net/test/read.cgi/php/1133361560/
0514nobodyさん2006/02/09(木) 00:56:03ID:???
>>513
任意
~~~~~
0515nobodyさん2006/02/09(木) 01:57:20ID:???
>>514
ここは禅問答する場所か?
0516nobodyさん2006/02/09(木) 02:07:08ID:???
素人が多くなったな
0517nobodyさん2006/02/09(木) 04:00:41ID:???
>514
任意ってのは好きな時間を入力できるって意味で、何時の時間を基準とするかが示されていない
1970が基準とするならgmtimeでもlocaltimeでも好きなのを使え
1970以前なら・・・俺にゃわからんので他の人おながい
0518nobodyさん2006/02/09(木) 04:04:11ID:I2pVJ8U2
掲示板を作成していて書き込んだ内容を管理人が自由に削除したり出来るようにしたいのですが
ソースから消すのはもちろん簡単ですが、サイト上からそれを削除できるようにしたいのです

●●.datというファイルから特定の行を削除orそれ以外を保存するというのはどういった方法がいいのでしょうか?
先輩方のご指南よろしくお願いいたします
0519nobodyさん2006/02/09(木) 04:04:46ID:???
起算する日時が1970年以降なら、
起算する日時分の秒数を足してlocaltime()なんかで変換。
0520nobodyさん2006/02/09(木) 04:18:22ID:???
>>517>>519
123456789秒は年、月、日、時、分、秒?
0521nobodyさん2006/02/09(木) 04:23:52ID:???
>>518
下の段落だけ読めたので、そこに反応すると、
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq5.html#How_do_I_change_one_line_in_a_fi
とかTie::Fileとか、巷に落ちてる掲示板のスクリプトを読めばおk
0522nobodyさん2006/02/09(木) 04:26:27ID:???
>520
localtime(GMT+9) → 1973/11/30(Fri) 06:33:09
gmtime → 1973/11/29(Thu) 21:33:09
05235222006/02/09(木) 04:27:34ID:???
1970年が起算の場合ね
0524nobodyさん2006/02/09(木) 04:39:55ID:???
>>523
localtimeやtime以外の話

123456789秒は年、月、日、時、分、秒?
05255242006/02/09(木) 05:17:43ID:???
>>522
ああそうか1970を引けばいいのか
でも123456789秒から1973/11/30(Fri) 06:33:09をどうやって?
0526nobodyさん2006/02/09(木) 05:57:10ID:???
>>518
open F, "+<●●.dat" or die $!;
flock F, 2;
my @data = <F>;
splice @data, 特定の行, 1;
seek F, 0, 0;
print F @data;
truncate F, tell F;
close F;
05275242006/02/09(木) 07:09:53ID:???
ああそうか俺がバカだった…


1: 任意の“秒”$unkotimeから分・時間・日・月・年を求めたい
2: それでlocaltime($unkotime)でやってみたが
3: 以下のようになった

・$yearから70を引いた → 100年を超えないときはおkだけど100年で“-70年”になる
・$hourから-9 → “-3”時などになる
・$wdayから-1 → 現在のところ支障なし(?)に見えるが…

ちなみに鯖は国内です
0528nobodyさん2006/02/09(木) 08:10:50ID:???
普通に計算したら?
($unkotime % 60)←秒
(int($unkotime / 60) % 60)←分
もっと簡単な書き方あるかもしれないが、こんな感じであとは自分で考えれ。
0529nobodyさん2006/02/09(木) 09:04:42ID:???
で、60日は何月なのよ?
0530nobodyさん2006/02/09(木) 10:20:40ID:???
そもそも、普通に既存のスクリプトでないのか?
0531nobodyさん2006/02/09(木) 14:06:01ID:???
適当に作ってみた。
mygmtime_presetを起算日として、gmtime互換の日付を返す。
1970,1,1を渡すとgmtimeと同じ動きをする(はず)。

use Date::Calc qw(Add_Delta_Days Day_of_Week Day_of_Year);

my $gmtime_ad = mygmtime_preset(1, 1, 1);
print join(" ", $gmtime_ad->(123456789)), "\n";
exit;

sub mygmtime_preset
{
my @base = @_;
return sub {
my $sec = shift;
my @date = Add_Delta_Days(@base[0..2], $sec/(24*60*60));
my $wday = Day_of_Week(@date);
my $yday = Day_of_Year(@date)-1;
$date[0] -= 1900;
--$date[1];
return ((gmtime($sec%(24*60*60)))[0..2], reverse(@date), $wday, $yday, 0);
};
}
0532nobodyさん2006/02/09(木) 14:18:34ID:46AFp3BF

ファイルの中にある“。”と“、”の数を数えたいんですけど

$word=~ /。/g;

だと・・
どうすればいいですか?
0533nobodyさん2006/02/09(木) 14:23:27ID:???
while ($word =~ /。/g) { $count++; }
0534nobodyさん2006/02/09(木) 14:41:50ID:46AFp3BF
>>533
ありがとうございます

$文字数 = $word;
$文字数 = s/。/。/g;

ってのはおすすめできないんでしょうか?
0535nobodyさん2006/02/09(木) 14:52:24ID:???
PCで普通に日本語が使えるようになってからの世代には手を焼く。
0536nobodyさん2006/02/09(木) 15:07:47ID:???
それとこれとは関係なかろう。
0537nobodyさん2006/02/09(木) 17:37:51ID:???
変数名に日本語使えたら楽でいいなぁ。
勿論自分で使うの限定で。
05385222006/02/09(木) 17:43:50ID:???
>>532
$cnt = $word =~ /。/g;
でOK
0539nobodyさん2006/02/09(木) 18:05:06ID:???
>>537
use utf8; とはいえ変換する分煩雑じゃないか?
0540nobodyさん2006/02/09(木) 18:12:47ID:???
>>539
うん、確かに煩雑だけど、それを補って余りあるぐらい見やすいかなと。
あとは、変数名考えるのも結構大変だしねw
0541nobodyさん2006/02/09(木) 18:28:53ID:???
>537
そんなあなたにはjavaがお勧め
0542nobodyさん2006/02/09(木) 20:02:23ID:???
>537
そんなあなたにはrubyがお勧め
0543nobodyさん2006/02/09(木) 20:05:35ID:???
rubyで日本語使えるんだ。
初めて知った。
0544nobodyさん2006/02/09(木) 21:15:33ID:???
日本語の変数名が見やすいとか言う感覚がさっぱり理解できん。
0545nobodyさん2006/02/09(木) 21:24:19ID:???
my ($kaunnta-, $hennsuu, $jikann);
0546nobodyさん2006/02/09(木) 21:28:43ID:???
perlを勉強し始めたばかりの者ですが、
連想配列というものは$xx{文字列}と定義すると書いてあるのですが、文字列はクォーテーションで囲っている物を文字列というのですよね?
ということは$xx{"soeji"}のように定義するのでよいのでしょうか?

よろしくお願いしますm(_ _)m
0547nobodyさん2006/02/09(木) 21:33:18ID:???
>>546
うん
後裸のワードでぐぐれ
0548nobodyさん2006/02/09(木) 21:38:22ID:???
つまり$xx{soeji}でも認識できるけど、文法上よくはないということですね…

どうもありがとうございました!m(_ _)m
0549nobodyさん2006/02/09(木) 21:39:19ID:???
>>547
裸のワードとは違うけどね。
0550nobodyさん2006/02/09(木) 21:40:19ID:???
>>548
いやいや、文法上良いの。
0551nobodyさん2006/02/09(木) 21:56:50ID:???
>>549-550
0552nobodyさん2006/02/09(木) 21:58:17ID:???
アクセスした人の環境変数を全てtextに書いていくプログラムを書いたのですが、
 #!/usr/local/bin/perl
 
 print "Content-type: text/html\n\n";
 open(DATA, ">> data.dat");
 print(DATA "%ENV<HR>\n");
 close(DATA);
 exit;

エラーが出て動きません。
自分ではこのソースに間違いを見つけられないのですが、その他パーミッションなどの設定のほうを疑うべきでしょうか…?
お願いしますm(_ _)m
0553nobodyさん2006/02/09(木) 22:00:39ID:???
>>552
何でもカッコつけりゃいいってもんじゃないってこと。
0554nobodyさん2006/02/09(木) 22:02:20ID:???
どういうことですか…?
0555nobodyさん2006/02/09(木) 22:09:16ID:???
コンマが足りない
0556549=5502006/02/09(木) 22:16:00ID:???
>>551
ん?何かまずいこと言った?
らくだ本にも、
> 次のような記法 (中略) で使われる裸の識別子は、裸のワードとは見なされない。
> なぜなら、これらは「文法的にほかに解釈がない」のではなく、
> 規則によって陽に許される書き方だからである。
って書いてるよ。
0557nobodyさん2006/02/09(木) 22:19:08ID:???
はいはいわろすわろす
0558nobodyさん2006/02/09(木) 22:35:43ID:???
>>552
パーミッションじゃない?
open() のとこをこんな風にしてエラーメッセージを出させてみては?

unless (open(DATA, ">> data.dat")) {
print "Open error: $!\n";
exit;
}
0559nobodyさん2006/02/09(木) 23:12:20ID:???
>553
クイズにヒントを出して楽しむ場所じゃ有りません

>552
 print "Content-type: text/plain\n\n";
 open(DATA, ">>data.dat");
 print DATA "%ENV<HR>\n";
 close(DATA);
 print "output ok\n";
 exit;
0560nobodyさん2006/02/09(木) 23:17:44ID:???
>>559
0561nobodyさん2006/02/09(木) 23:21:13ID:???
>>560
0562nobodyさん2006/02/09(木) 23:21:28ID:???
はいはいわろすわろす
0563nobodyさん2006/02/09(木) 23:22:22ID:???
はいはいわろすわろす
0564nobodyさん2006/02/09(木) 23:26:16ID:???
はいはいわろすわろす
0565nobodyさん2006/02/09(木) 23:26:53ID:???
>562-564
0566nobodyさん2006/02/09(木) 23:26:57ID:???
webprog板らしい流れだな
0567nobodyさん2006/02/09(木) 23:28:12ID:???
>566
>565
0568nobodyさん2006/02/10(金) 00:21:11ID:???
わろわろはいすはいす
0569nobodyさん2006/02/10(金) 00:23:50ID:???
はいわろ
05705522006/02/10(金) 02:09:46ID:???
わかる人がいないようなので失礼しますね
0571nobodyさん2006/02/10(金) 02:17:10ID:???
my @tmp1 = ();
my %tmp2 = ('mode'=>'hoge','data'=>'test');
push @tmp1, \%tmp2;

↑と同じ事を1行でやろうとすには、どうしたら良いのでしょか?

my @tmp1 = (('mode'=>'hoge','data'=>'test'));

↑では、できませんでした…。
0572nobodyさん2006/02/10(金) 02:39:03ID:???
mixiのコードばら撒かれちゃったらしいけどどこかに残ってませんか?
0573nobodyさん2006/02/10(金) 02:44:06ID:???
home.plだけならある
0574ヽ(´ー`)ノ ◆.ogCuANUcE 2006/02/10(金) 03:17:56ID:???
>>571
my @tmp1 = ({'mode'=>'hoge','data'=>'test'});

リファレンスについて勉強しる。
0575nobodyさん2006/02/10(金) 04:19:33ID:???
>552=570
レスをちゃんと読んだか?
質問の投げ去りはやめろや
0576質問2006/02/10(金) 11:34:07ID:+Mjswkwe
2項分布の計算を行いたいのですが、
2項分布内のひとつの項を$k_posとする場合、

for($j=1;$j<10;$j++){
$k_pos=combi($g,$b)*(($bl_bun[$j]/65536)**$b)
*(((65536-$bl_bun[$j])/65536)**($g-$b));
}

というコードにすると、$gや$bが大きい場合、結果が出なくなってしまいます。
(combiというのは自作subです)
恐らく、掛け合わせる数が思いっきりでかい数と思いっきり小さい数を掛け合わせてるのが原因だと思います。
何か解決方法はありますでしょうか?よろしくお願いします。
0577nobodyさん2006/02/10(金) 14:05:43ID:???
use bignum;
は試してみた?
■ このスレッドは過去ログ倉庫に格納されています