Perlコーディング初心者質問スレ Part 46
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/01/18(水) 02:17:46ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0516nobodyさん
2006/02/09(木) 02:07:08ID:???0517nobodyさん
2006/02/09(木) 04:00:41ID:???任意ってのは好きな時間を入力できるって意味で、何時の時間を基準とするかが示されていない
1970が基準とするならgmtimeでもlocaltimeでも好きなのを使え
1970以前なら・・・俺にゃわからんので他の人おながい
0518nobodyさん
2006/02/09(木) 04:04:11ID:I2pVJ8U2ソースから消すのはもちろん簡単ですが、サイト上からそれを削除できるようにしたいのです
●●.datというファイルから特定の行を削除orそれ以外を保存するというのはどういった方法がいいのでしょうか?
先輩方のご指南よろしくお願いいたします
0519nobodyさん
2006/02/09(木) 04:04:46ID:???起算する日時分の秒数を足してlocaltime()なんかで変換。
0521nobodyさん
2006/02/09(木) 04:23:52ID:???下の段落だけ読めたので、そこに反応すると、
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:???localtime(GMT+9) → 1973/11/30(Fri) 06:33:09
gmtime → 1973/11/29(Thu) 21:33:09
0523522
2006/02/09(木) 04:27:34ID:???0525524
2006/02/09(木) 05:17:43ID:???ああそうか1970を引けばいいのか
でも123456789秒から1973/11/30(Fri) 06:33:09をどうやって?
0526nobodyさん
2006/02/09(木) 05:57:10ID:???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;
0527524
2006/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:???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:???0534nobodyさん
2006/02/09(木) 14:41:50ID:46AFp3BFありがとうございます
$文字数 = $word;
$文字数 = s/。/。/g;
ってのはおすすめできないんでしょうか?
0535nobodyさん
2006/02/09(木) 14:52:24ID:???0536nobodyさん
2006/02/09(木) 15:07:47ID:???0537nobodyさん
2006/02/09(木) 17:37:51ID:???勿論自分で使うの限定で。
0540nobodyさん
2006/02/09(木) 18:12:47ID:???うん、確かに煩雑だけど、それを補って余りあるぐらい見やすいかなと。
あとは、変数名考えるのも結構大変だしねw
0541nobodyさん
2006/02/09(木) 18:28:53ID:???そんなあなたにはjavaがお勧め
0542nobodyさん
2006/02/09(木) 20:02:23ID:???そんなあなたにはrubyがお勧め
0543nobodyさん
2006/02/09(木) 20:05:35ID:???初めて知った。
0544nobodyさん
2006/02/09(木) 21:15:33ID:???0545nobodyさん
2006/02/09(木) 21:24:19ID:???0546nobodyさん
2006/02/09(木) 21:28:43ID:???連想配列というものは$xx{文字列}と定義すると書いてあるのですが、文字列はクォーテーションで囲っている物を文字列というのですよね?
ということは$xx{"soeji"}のように定義するのでよいのでしょうか?
よろしくお願いしますm(_ _)m
0548nobodyさん
2006/02/09(木) 21:38:22ID:???どうもありがとうございました!m(_ _)m
0552nobodyさん
2006/02/09(木) 21:58:17ID:???#!/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
0554nobodyさん
2006/02/09(木) 22:02:20ID:???0555nobodyさん
2006/02/09(木) 22:09:16ID:???0556549=550
2006/02/09(木) 22:16:00ID:???ん?何かまずいこと言った?
らくだ本にも、
> 次のような記法 (中略) で使われる裸の識別子は、裸のワードとは見なされない。
> なぜなら、これらは「文法的にほかに解釈がない」のではなく、
> 規則によって陽に許される書き方だからである。
って書いてるよ。
0557nobodyさん
2006/02/09(木) 22:19:08ID:???0558nobodyさん
2006/02/09(木) 22:35:43ID:???パーミッションじゃない?
open() のとこをこんな風にしてエラーメッセージを出させてみては?
unless (open(DATA, ">> data.dat")) {
print "Open error: $!\n";
exit;
}
0559nobodyさん
2006/02/09(木) 23:12:20ID:???クイズにヒントを出して楽しむ場所じゃ有りません
>552
print "Content-type: text/plain\n\n";
open(DATA, ">>data.dat");
print DATA "%ENV<HR>\n";
close(DATA);
print "output ok\n";
exit;
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:???0566nobodyさん
2006/02/09(木) 23:26:57ID:???0567nobodyさん
2006/02/09(木) 23:28:12ID:???>565
0568nobodyさん
2006/02/10(金) 00:21:11ID:???0569nobodyさん
2006/02/10(金) 00:23:50ID:???0570552
2006/02/10(金) 02:09:46ID:???0571nobodyさん
2006/02/10(金) 02:17:10ID:???my %tmp2 = ('mode'=>'hoge','data'=>'test');
push @tmp1, \%tmp2;
↑と同じ事を1行でやろうとすには、どうしたら良いのでしょか?
my @tmp1 = (('mode'=>'hoge','data'=>'test'));
↑では、できませんでした…。
0572nobodyさん
2006/02/10(金) 02:39:03ID:???0573nobodyさん
2006/02/10(金) 02:44:06ID:???0574ヽ(´ー`)ノ ◆.ogCuANUcE
2006/02/10(金) 03:17:56ID:???my @tmp1 = ({'mode'=>'hoge','data'=>'test'});
リファレンスについて勉強しる。
0575nobodyさん
2006/02/10(金) 04:19:33ID:???レスをちゃんと読んだか?
質問の投げ去りはやめろや
0576質問
2006/02/10(金) 11:34:07ID:+Mjswkwe2項分布内のひとつの項を$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:???は試してみた?
0578nobodyさん
2006/02/10(金) 17:20:13ID:???これの値がいい加減だと読み込みが変になるみたいで、レスポンスが大幅に遅くなりました。
i-modeのためContent-Lengthは必須みたいで困ってます。
値を取るのは一般的な方法で全データを変数に入れてlengthで計ってるんですけど
うまくいかないです。
何が原因やら・・・文字コードはUTF8で統一していますが・・・
0579nobodyさん
2006/02/10(金) 17:21:22ID:???1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
0580578
2006/02/10(金) 17:40:28ID:???どうも。でへへ。
もしかしたら僕と同じミスをする人が出てくるかもしれないので原因を書いておきます。
えーと、lengthで計算する変数に"Content-type: text/html"を含めていたので
うまく計算できなかったみたいです。
この一文を外して、
print "Content-type: text/html\n";
print 'Content-Length: ', $length, "\n\n";
print $data;
としたら上手くいきました。
どうもスレ汚しすみません。
0581nobodyさん
2006/02/10(金) 20:19:09ID:???0582nobodyさん
2006/02/10(金) 21:02:02ID:???0583nobodyさん
2006/02/10(金) 21:15:50ID:???0584nobodyさん
2006/02/10(金) 21:48:34ID:???0585nobodyさん
2006/02/10(金) 21:59:59ID:???0587nobodyさん
2006/02/11(土) 00:14:36ID:???おやすみうな
0588nobodyさん
2006/02/11(土) 01:25:48ID:???0589質問
2006/02/11(土) 08:21:02ID:qlKqkAMKしたいのですが、bignumはどこにあるのでしょうか?
0590nobodyさん
2006/02/11(土) 09:05:06ID:???0592ヽ(´ー`)ノ ◆.ogCuANUcE
2006/02/11(土) 13:32:23ID:???0594ヽ(´ー`)ノ ◆.ogCuANUcE
2006/02/11(土) 18:51:50ID:???あ、なるほど。そうすると不完全だけど、perldoc -l かな。
ttp://blog.livedoor.jp/nipotan/archives/50146747.html
0595nobodyさん
2006/02/12(日) 06:58:32ID:bHuVlhbgバージョンが5.0?(詳しくは失念しましたが)からは種となるsrandを使わなくても良くなりましたよね?
バージョンが5.8のサーバで昔作られたsrandが使用されているスクリプトを使っていたんですが、
先日新しいバージョンではsrandを使うとむしろ乱数の品質が下がると言う事を知りました。
元よりどうも乱数が偏っているなと感じていたんですが、
それはこのsrandの性と考えていいんでしょうか?
それとも単なる勘違い的なものでしょうか?
乱数の使い方はおみくじとかサイコロとかそういったもので、
何かのシミュレートとかの用途ではありません。
今までサイコロで言えば1が5回連続して出たけど、それは確かにたまにはあるし、
たまたま出た時が強く印象に残っただけだ、と思っていたんですが。
とりあえずsrandは外す方向で考えているのは当然なんですけど、
どうにも今まで起きてた事象のモヤモヤが引っかかって。
0596nobodyさん
2006/02/12(日) 08:04:29ID:???srand(1)なら1番の乱数表を使うというような。
乱数の質はシステム依存。
1万回サイコロを振った程度なら偏るものだけどね。
偏りがほしくないのなら、別の方法を考える。
0597nobodyさん
2006/02/12(日) 09:33:07ID:???> 偏りがほしくないのなら、別の方法を考える。
? 何を言っているのかわかってる?
0598nobodyさん
2006/02/12(日) 09:56:51ID:???0599nobodyさん
2006/02/12(日) 10:05:55ID:???ただの勘違い。
ただしまともな乱数使ってもプログラムの中で偏った分布をするような
プログラミングがされていたら当然偏るけどね。
0601596
2006/02/12(日) 10:10:06ID:???0602nobodyさん
2006/02/12(日) 11:07:16ID:???表示させるすべての桁でランダムで数字を表示するプログラムを改造して、アルファベットもランダムで表示させたいのですが、どう改造すればいいでしょうか?
ソースは、
# ランダム桁のランダム数字の生成
$max_num =1;
$min_num =1;
for( ; ; ){
$num_digit = rand($MAX_DIGIT)%$MAX_DIGIT+1;
last if($num_digit >= $MIN_DIGIT);
}
for($i=0; $i<$num_digit; $i++){ $max_num *= 10; }
$min_num = $max_num/10;
for( ; ; ){
$num = rand($max_num)%$max_num;
last if($num >= $min_num);
}
です。
0〜9まではこれで表示できるんですが、'a'〜'z'までを時間を種にして表示させたいんです。
0603nobodyさん
2006/02/12(日) 13:32:27ID:???0604nobodyさん
2006/02/12(日) 14:11:18ID:???XXX には半角アルファベット大文字か数字が入り、1桁から3桁程度です。
だいたいうまくいくのですが、「階」という漢字のあとにXXX号室が来ると化けてしまいます。
ソースコードは次の通りです。環境はWindows2000 ActivePerl5.8.7です。
my @a;
my @b;
push @a, "A4号室";#うまくいきます
push @a, "1FC5号室";#うまくいきます
push @a, "1階206号室";# K206号室 になってしまいます
push @a, "A棟207号室";#うまくいきます
foreach (@a){
push @b, "$&\n" if /[A-Z0-9]+号室/;
}
print @b;
「1階206号室」のときだけ「K206号室」になってしまいます。
何が原因で、どうすればよいのでしょうか。
どなたかご教授いただけると助かります。
0605nobodyさん
2006/02/12(日) 14:38:27ID:???「階」が Shift_JIS だと「8A 4B」なので二バイト目の「4B」が「K」にあたるのが原因だね。
/[A-Z0-9]+号室/s にすればいい。
0606605
2006/02/12(日) 14:39:03ID:???Perl だとどうするんだろう?
0607nobodyさん
2006/02/12(日) 14:44:47ID:???てけとーな応急処置だけど、よかったらどうぞ。
0608nobodyさん
2006/02/12(日) 14:46:18ID:???0610604
2006/02/12(日) 15:14:54ID:???原因は>>605さんのおっしゃるように、Shift_JISの2バイト目とマッチしてしまったからなのですね。
勉強になりました。
対処としては>>607でうまくいきました。ありがとうございました。
(?<![\x81-\xfc])の部分ですが、Shift_JISの2バイト目を取らないように、
「左側にShift_JISの1バイト目が存在しない位置」を指定しているという理解で合ってますか?
0611604
2006/02/12(日) 15:48:35ID:???>>604のコードには記述しませんでしたが、処理対象には●12号室 ■10号室 のようなパターンもあり、
これまでは上手くいってましたが、>>607では 2号室 0号室 と出力されてしまいます。
Shift_JISは使わないほうが良いのでしょうか・・・
0612nobodyさん
2006/02/12(日) 15:59:29ID:???0613nobodyさん
2006/02/12(日) 16:57:35ID:???use Encode;
my $pattern = '([A-Z0-9]+号室)';
my $str = "1階206号室";
Encode::from_to($pattern, 'sjis', 'utf8');
Encode::from_to($str, 'sjis', 'utf8');
$str =~ /$pattern/;
my $match = $1;
Encode::from_to($match, 'utf8', 'sjis');
print $match;
■ このスレッドは過去ログ倉庫に格納されています