Perlコーディング初心者質問スレ Part 46
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/01/18(水) 02:17:46ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
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;
0614607
2006/02/12(日) 18:51:15ID:???あくまで >>613 の言うように utf8 で処理するのが王道なのは百も承知で。
push @b, "$1\n" if /(?:[\x81-\xfc].)*([A-Z0-9]+号室)/;
0615nobodyさん
2006/02/12(日) 20:04:49ID:???乱数以外の偏らない別の方法って何?
ヒントだけでもいいから教えて
偏らないってどういう意味?
1万回やると「6」は1666回出るの?それとも1667回出るの?
0617nobodyさん
2006/02/12(日) 20:09:39ID:???または
/[A-Za-z0-9]{1,3}号室/
0619nobodyさん
2006/02/12(日) 23:28:00ID:ptODJMag削除パスワードが“1111”や“1212”、“1122”みたいな単純なパスワードを弾くには
どうすればいいでしょうか?
if ($password = ~ /1111/){ $error = 'エラーです'};
if ($password = ~ /1212/){ $error = 'エラーです'};
みたいにいちいち指定するよりもスマートな方法を伝授してください
0620nobodyさん
2006/02/12(日) 23:31:23ID:???0621619
2006/02/12(日) 23:42:10ID:ptODJMag1111 などの連続
1212 1122 1222 などの2つの種類の文字のみ
のつもりです
0622604
2006/02/12(日) 23:54:16ID:???うまくいきました。ありがとうございます。
調べて初めて知ったのですが、UTF8だと文字の途中のバイトでマッチしなくてすむようなので、
このやり方が適切みたいですね。
>>614
[\x81-\xfc]のあとのドットで2バイト目をマッチさせてるんですね。
ドットは任意の1文字としか考えてませんでしたので、途中の1バイトを1文字とみなして
マッチさせるとは思いもしませんでした。勉強になります。
>>616-617
そのやり方でも上記データを処理できますが、アルファベットは大文字固定で、
長さは3文字以上もありうるので[A-Z0-9]+になります。レスありがとうございました。
0623nobodyさん
2006/02/12(日) 23:57:14ID:???if (scalar (grep { !$seen{$_}++ } split //, $password) <= 2) {}
とかどうだろう。
0624619
2006/02/13(月) 00:18:53ID:NkDDMowLどうもです
書き忘れましたけど最初↓
if ($password = ~ /(.)(\1|(.))(\1|\2)(\1|\2)/){ $error = 'エラーです'};
これだとなんかおかしいんです
どこがおかしいのか自分でも
0625nobodyさん
2006/02/13(月) 01:06:45ID:???0626nobodyさん
2006/02/13(月) 01:07:12ID:bzAWjmTkプログラム中に
print $env = $ENV{'QUERY_STRING'};
と文を書き
$envに「name=maruyama」が入ることを期待して
URLに
http://www.hogehoge.jp/cgi-bin/index.cgi?name=maruyama
を打ち込みましたが「Internal Server Error」となります。
この場合URLの「?」の後ろ(name=maruyama)をブラウザに表示させるにはどのようにしたらよいのでしょうか?
0627nobodyさん
2006/02/13(月) 01:11:46ID:???print $query;
0628nobodyさん
2006/02/13(月) 01:12:32ID:???0629nobodyさん
2006/02/13(月) 01:14:48ID:???0630619
2006/02/13(月) 01:23:47ID:NkDDMowLif ($password = ~ /(.)(\1|(.))(\1|\2)(\1|\2)/){ $error = 'エラーです'};
0631nobodyさん
2006/02/13(月) 01:33:47ID:???最後の2文字を入れ替えてごらん
それと・・・
>629
0632nobodyさん
2006/02/13(月) 01:37:18ID:bzAWjmTk違うところが間違ってました。
お答えありがとうございました。
自己解決しました。
ご迷惑をおかけしました
0633619
2006/02/13(月) 01:38:58ID:NkDDMowLif ($password = ~ /(.)(\1|(.))(\1|\2)(\1|\2)/){ $error = 'エラーです'};
でも
if ($password = ~ /(.)(\1|(.))(\1|\2)(\1|\2)/){ $error = 'エラーです';}
でも結果は同じでした
(.)(\1|(.))(\1|\2)(\1|\2) ←ここをどうすればいいんでしょうか?
0634nobodyさん
2006/02/13(月) 02:17:57ID:???# 9文字以下はエラー
if(length($pass) < 9){ &error(); }
# 数字小文字大文字記号が混ざってないとエラー
if(!(($pass =~ /\d/) && ($pass =~ /[a-zA-Z]/) && ($pass =~ /[_!#$%&'()=\-"\[\]\|{}\/\.,\?]/))){ &error(); }
# 同じ文字が連続したらエラー
if($pass =~ /([0-9a-zA-Z])\1/g){ &error(); }
0635634
2006/02/13(月) 02:20:28ID:???$pass =~ /(.)\1/g
0636619
2006/02/13(月) 02:25:30ID:NkDDMowLどうもです。
2種の文字で構成されるパスの場合のエラーの場合どうすればいいでしょうか?
0637nobodyさん
2006/02/13(月) 02:28:03ID:???0640634
2006/02/13(月) 04:00:03ID:???ちったぁ考えろ
終了
0643nobodyさん
2006/02/13(月) 14:25:40ID:???open(UNKO "kusai.txt");
@BENKI=<UNKO>;
みたいにopen()関数で開いたテキスト内容(別にテキストじゃなくても良いが)
を配列に代入してるけど、スカラーじゃ駄目なの?
スカラーだと変数が32bitしかないから、エラい人が個々の配列にに自動で文字列を
一文字づつ代入してくれるから?
0644643
2006/02/13(月) 14:26:52ID:???脳内補正よろしく。
0645nobodyさん
2006/02/13(月) 14:56:24ID:???<>はスカラーコンテキストで使用すると一行読み込む。( $hoge = <FUGA> )
リストコンテキストで使用するとファイルをすべて読み込む。( @hoge = <FUGA> )
一気に配列に読み込む必要性が無ければ、
スカラーコンテキストで一行ずつ読み込んだ方が使うメモリーは少なくてすむので
私としてはそうすることをお勧めしたい。
しかし、一気に読み込むことでファイルをロックするべき時間が短くなるという利点もあり、
そういう風に一気に読み込むことを好む人もいる。前にこのスレで議論になったこともあった希ガス。
> 個々の配列にに自動で文字列を一文字づつ代入
配列の個々の要素に一文字一文字、ということ?一行ずつの文字列が入るよ。
$hoge[0] = "foo\n";
$hoge[1] = "bar\n";
> スカラーだと変数が32bitしかないから
Perlでは内部的に自動で整数型、不動小数点型、文字列型などを変換する。
ユーザ側は通常大きさを考えるようなことは無いし、この場合では文字列型になる。
0646nobodyさん
2006/02/13(月) 18:09:49ID:???# メモリの許す限り全Read
@lines = <IN>;
# 改行まで
$line = <IN>;
メモリ使用量に関して645さんのを補完すると
foreach (<IN>){ 〜処理〜 }
じゃなくて
while (<IN>){ 〜処理〜 }
です。
・・・だよね? (;´∀`)
0647nobodyさん
2006/02/13(月) 20:42:55ID:???0648nobodyさん
2006/02/13(月) 22:21:17ID:???上のaaa.cgiはフォーム入力からデータをファイルに書き出すCGIです。
SUBMITで自分自身を呼び出して何回も書き込めるようにしています。
下のbbb.cgiはaaa.cgiで作ったファイルからデータを1件づつ読み込んでいます。
【疑問】aaa.cgiでSUBMITを押してもbbb.cgiが動かないので画面のデータが更新されない。
【希望】aaa.cgiで更新したデータをすぐに下のbbb.cgiを動かして画面を更新したい。
bbb.cgiに更新ボタンを設置するのはやりたくない。
どうすればいいでしょうか?
0649nobodyさん
2006/02/13(月) 22:38:17ID:???0650nobodyさん
2006/02/13(月) 22:43:31ID:???> while (<IN>){ 〜処理〜 }
この二つって何が違うのでつか?
0651nobodyさん
2006/02/13(月) 22:51:19ID:???条件式が真の間繰り返す。
行入力演算子のときはwhile。
0652nobodyさん
2006/02/13(月) 23:03:26ID:???そんなあなたには
つ【JavaScript】
0653nobodyさん
2006/02/13(月) 23:11:16ID:???0654648
2006/02/13(月) 23:48:12ID:???652さん、その手もありましたか。調べてみます。
653さん、キーワードありがとうございます。やってみます。
ヒントありがとうございました。<(_ _)>
0655nobodyさん
2006/02/14(火) 00:32:58ID:INKxTjszprint qq(<INPUT type="submit" value="push">\n);
print qq(<input type="hidden" name="mode" value="change">\n);
print qq(</FORM>\n);
これを実行する(WEBページでPUSHボタンを押す)と「ファイルのダウンロード」(ローカルに保存)となってしまい、CGIが実行しません。
CGIを実行させるにはどのようにしたらよいのでしょうか?
0656nobodyさん
2006/02/14(火) 00:51:49ID:???・foreachやforはリストを元にしたループも可能。リストコンテキスト。ループ前に全部読む。
・while(<FH>)はwhile(defined($_ = <FH>))の略記。スカラーコンテキスト。ループ1周で1行読む。
>>655
実際に実行されてる可能性もある。とりあえずそれをダウンロードして中身をチェック。
CGIのプログラム本体が落ちてきたのならサーバ側の設定の問題でPerlは関係ないだろう。
0657655
2006/02/14(火) 01:45:00ID:INKxTjszApacheの設定ですかねえ。
どこをどのように書き換えたらよいのかよくわからないです・・・。
0658nobodyさん
2006/02/14(火) 01:51:15ID:???0659nobodyさん
2006/02/14(火) 02:08:04ID:???read(STDIN, $str, $ENV{'CONTENT_LENGTH'});
は
$str = <STDIN>;
とどこが違うんですか?
0660nobodyさん
2006/02/14(火) 02:26:53ID:???0661nobodyさん
2006/02/14(火) 04:01:35ID:???0662643
2006/02/14(火) 13:54:25ID:???つまり便器に入ったウンコを一段ずつ取り出すには配列の個々にアクセスすれば良い訳ですね。
0663nobodyさん
2006/02/14(火) 16:36:29ID:TPTf1Qt3(ひらがなのみとか、全角文字のみとか、半角英数のみとか)
何か情報がまとまってあるところないでしょうか?
というか、今ひらがなのみはなんとか以下のコードで動いたんですが
print "Content-type: text/html; charset=Shift_JIS\n\n";
$pattern = '(?:\x82[\x9F-\xF1])*';
$data =~ /$pattern/;
if ($& eq $data){
print "match";
}else{
print "unmatch";
}
exit;
なんかあやしいです。
回りくどいし
0664nobodyさん
2006/02/14(火) 16:47:09ID:OAiNE+tIcgiが”更新 ”ボタンで呼び出されたのかどうかが知りたい
2 : やってみたこと、
cgi-lib.plの &ReadParse(*form)でformの値を取得してみた。
3 : でも何も新しい値が入っていない
ごめんなさい、どうやって類似の記事を探したらいいのかわからなくて
せめてヒントをお願いします。m(_ _)m
0665nobodyさん
2006/02/14(火) 17:17:27ID:???0666nobodyさん
2006/02/14(火) 17:31:14ID:???サンプルコードなどで適当に変数名をつけるときに使う
英語ではfooやbarが使われるのでfoo,barについてはrfcにもなっている
ほげ学のサイトがあるので探してみ
0667nobodyさん
2006/02/14(火) 18:13:45ID:???つ【アクセスログ】
0670nobodyさん
2006/02/14(火) 21:32:00ID:???コントロールコードを拒否したければ
\x0-\x1f の範囲でオケなのかな?
0671nobodyさん
2006/02/14(火) 22:37:15ID:mb5R1R6vPerlで作ったおみくじCGIをサイトに置いたんですが
わたしのサイトに来てくださる人の携帯(DoCoMo)では動作しないって言われました
それでわたしも携帯で動作を確認するとやっぱり動きませんでした
PCでは問題なく動作するのですが携帯向けには何かしなければならないのでしょうか?
>>8-で紹介されているサイト様も見てみたんですが書いてありません
詰まってしまいました
どなたか原因が分かりますでしょうか?
0672nobodyさん
2006/02/14(火) 22:52:06ID:???http://pc8.2ch.net/test/read.cgi/tech/1138519327/395
レスもらってるんだから、調べてからにして下さい。
動作しない、だけでは解決のしようがありません。
0673nobodyさん
2006/02/14(火) 23:13:17ID:mb5R1R6vすいません、そこにもないです
それからレスはhttp://pc8.2ch.net/test/read.cgi/tech/1138519327/395
で誘導されたので気づきませんでした
0674nobodyさん
2006/02/14(火) 23:20:59ID:???誘導してもらってるのに、全然読んでないことだけは分かった。
シュミレータで確認汁。
それと、動かないだけじゃわかりません。
0675nobodyさん
2006/02/15(水) 00:01:00ID:???○ シミュレート
ここもゆとりんぐ全開かwww
0676nobodyさん
2006/02/15(水) 00:02:40ID:TfAwMHcm名前を入力してもらいボタンを押すと運勢が出るという
おみくじCGIでPOSTメソッドです
携帯だとボタンが押せない状態なんです
0677nobodyさん
2006/02/15(水) 00:06:18ID:???企業でも普通に使ってるみたいw
0678nobodyさん
2006/02/15(水) 00:13:03ID:???ゆとりんぐは勉強してろ
0680nobodyさん
2006/02/15(水) 00:19:54ID:???■ このスレッドは過去ログ倉庫に格納されています