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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2005/08/12(金) 01:26:47ID:mHnZWvqz
Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
0679nobodyさん2005/10/01(土) 23:13:02ID:???
>>646
遅レスだが、$!(errno)はシステムコールやライブラリ呼び出しが
失敗したときは値がそれに応じて設定されるけど、成功したときは
未定義なので、何になっているかはわからない。

perldoc perlvarの$!の説明をよく嫁。

0680nobodyさん2005/10/02(日) 04:48:22ID:???
すみません。
http://internet.watch.impress.co.jp/www/article/1999/1122/special.htm
でフォームからメールがおくれたのですが、確認画面を表示させたいのですが、
どのように書いていけばよいのでしょうか。
よろしくお願いします。
0681nobodyさん2005/10/02(日) 09:19:04ID:???
どのようにって・・・
まさか手取り足取り一から十まで順を追って説明しろなんて
ふざけた要求してるわけじゃないよな?

ここの説明を参考にやったんなら、
確認画面の表示の有るフォームメールcgiをいくつかダウンロードして
スクリプトを眺めてみればいいんじゃない?
0682nobodyさん2005/10/02(日) 10:23:03ID:???
スカラーコンテキストの演算子に
文字列の一部を正規表現でキャプチャし一発で渡したい時にはどうすればいいでしょうか?
一応 op ${\("STR" =~ /REGEX/g)}; でできるのですが冗長ですよね。
0683nobodyさん2005/10/02(日) 11:42:59ID:???
>>682
そういうのは一行で書く必然性が無ければ
二行に分けた方が読み解き易く美しい。

"STR" =~ /(REGEX)/;
op $1;

> ${\("STR" =~ /REGEX/g)};
REGEX にマッチした部分文字列の*リスト*を返した上で
無理矢理一つだけを利用しているのが無駄と混乱を招く。
どうしても /g を使いたければ

op +("STR" =~ /REGEX/g)[0];

とでもした方がいいだろう。
0684nobodyさん2005/10/02(日) 11:53:28ID:???
>>682
おそらく /g を付けているのは問題回避のためだろうから、
値1つを取れればいいなら

op +("STR" =~ /REGEX/)[0];
06856822005/10/02(日) 12:38:08ID:???
>>683 >>684
ありがとうございます。確認しました。
/gはラクダ本(日3版175P)に「リストコンテキストでm//gを使って…」とあったので両方必須なのだと勘違いしていました。
実際のコーディングは2文でやってみようと思います。
0686nobodyさん2005/10/02(日) 14:19:35ID:???
URLでよくtest.pl?line=ABC&line2=DEF
みたいに引数を渡す場合がありますがコマンドラインからこのような
引数を渡すにはどうしたらよいでしょうか?
#>perl test.pl 「ここの部分?」
0687nobodyさん2005/10/02(日) 14:35:59ID:???
perl test.pl line=ABC line2=DEF

値は @ARGV に入る。
06886862005/10/02(日) 15:14:12ID:???
>>687
サンクス。
if($#ARGV >= 0){ $buffer = join'&',@ARGV; }
デコードに付け加えて何とかなりますた。
0689nobodyさん2005/10/02(日) 15:16:12ID:???
>>688
if ($#ARGV >= 0)
より
if (@ARGV)
の方が好き。
06906862005/10/02(日) 15:19:46ID:???
>>689
アチャー。確かにそちらの方がいいですね。何か遠回りしてる漏れ。
0691nobodyさん2005/10/02(日) 16:49:19ID:???
if (scalar @ARGV) って書いちゃうなあ。
0692nobodyさん2005/10/02(日) 17:19:24ID:???
そもそも直で値を代入してしまう。
0693ヽ(´ー`)ノ ◆.ogCuANUcE 2005/10/02(日) 17:35:02ID:???
if 文使わなくても $buffer = join('&', @ARGV); だけで良くね?
@ARGV が空リストなら $buffer は空文字になるわけだし。

使うんなら $buffer = join('&', @ARGV) if @ARGV; かな。
0694nobodyさん2005/10/02(日) 17:51:48ID:???
前やったベンチでは@ARRAYより$#ARRAYの方が速かった
06956802005/10/03(月) 01:39:26ID:???
>>681さん、あれから自分でやってみてできました。
別に確認画面を作成してそのでーたをメールを送るCGIに渡すようにしました。
ありがとうございました。
0696もな2005/10/03(月) 02:21:03ID:???
掲示板をいちから作っているのですが、どうしてもdatファイルに文字を書き込めません。
書き込みボタンを押すとエラーが出るわけでもなく画面が遷移して、また再表示というふうにはなるのですが・・・。
どうかご教授願います。datファイルには何も書き込まれていない状態です・・

以下ソースです↓

#!/usr/bin/perl

require 'cgi-lib.pl';
&print_header(); #ヘッダを表示する

if(open(CHK,"bbs.dat")){
if(&get_data == 0){
if ($name eq '') {
&show_error('名前が記入されていません');
} elsif ($title eq '') {
&show_error('タイトルが記入されていません');
} elsif ($message eq '') {
&show_error('内容が記入されていません');
}
&write_to_file();
}
&read_file(); #ファイルからデータを読み出してリストに格納
&print_top(); #トップを表示する
}else{
&show_error('データファイルがオープンできません');
}

続く
0697もな2005/10/03(月) 02:22:02ID:???
sub print_header(){
$haikei_img ="back.jpg"; #背景画像の指定
print "Content-type: text/html\n\n";
print "<META HTTP-EQUIV=Content-Type CONTENT=\"text/html;CHARSET=Shit_JIS\">";
print "<html>\n";
print "<head><title>Simple BBS</title></head>\n";
print "<body style=\"background-image : url($haikei_img);background-repeat : no-repeat;background-attachment : fixed;\" text=#000000>\n";
}

sub print_top(){
print "<center<table width=600><tr><td>\n";
print "<br><br><center><h2>掲示板</h2>\n";
print "<hr> [ <a href=http://www.yahoo.co.jp>;Back To Homepage</a> ] <hr></center>\n";
print "<form method=post action=\"bbs1.cgi\">\n" ;
print "<table border=0>\n" ;
print "<tr><td align=right>名前 :</td><td><input type=text size=20 name=name></td></tr>\n" ;
print "<tr><td align=right>E-mail:</td><td><input type=text size=40 name=mail></td></tr>\n" ;
print "<tr><td align=right>URL :</td><td><input type=text size=40 value=http:// name=url></td></tr>\n" ;
print "<tr><td align=right>タイトル:</td><td><input type=text size=40 name=title></td></tr>\n" ;
print "<tr><td align=right>内容 :</td><td><textarea cols=50 rows=5 wrap=hard name=message></textarea></td></tr>\n" ;
print "<tr><td colspan=2 nowrap align=right><input type=submit value=送信><input type=reset value=書き直し></td></tr>\n" ;
print "</table>\n" ;
print "</form>\n" ;
}
0698もな2005/10/03(月) 02:23:21ID:???
sub get_data{
&ReadParse(*FORM_DATA);
if($FORM_DATA{'action'} eq 'reqist') {
&get_time(); #時刻の取得
$name = $FORM_DATA{'name'};
$message = $FORM_DATA{'message'};
$title = $FORM_DATA{'title'};
$mail = $FORM_DATA{'mail'};
$url = $FORM_DATA{'url'};
$action = $FORM_DATA{'action'};

    return 0;
}else{
return 1;
}

}

#========================================================
# 日付の取得と整形
#========================================================
sub get_time(){
($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime;
@weekday = ('日','月','火','水','木','金','土');
$week=$weekday[$wday];
$mon++;
$year = 1900+$year;
$date="$year年$mon月$mday日($week) $hour時 $min分 $sec秒";
}


0699もな2005/10/03(月) 02:24:43ID:???
sub write_to_file(){
open(WRITE,">>bbs.dat");
print WRITE"$name\t$mail\t$url\t$date\t$title\t$message\n";
close(WRITE);
}
sub read_file(){
open(READ,"bbs.dat");
@data_set = <READ>;
close(READ);
}
sub show_error(){
print "<h2>エラー発生</h2><hr><br>";
print "エラー内容: $_[0]";
print "<br>WebブラウザのBackボタンで戻ってください";
exit();
}
_END_
0700もな2005/10/03(月) 02:25:24ID:???
以上ですm(__)m
0701nobodyさん2005/10/03(月) 02:34:33ID:???
まるまる張るんだったらどこかにうpしる。
0702nobodyさん2005/10/03(月) 02:46:02ID:hN7oOpvn
perlのバージョンが3以下なんじゃないの???
それだとオブジェクト指向サポートしてないから書き込めないよ
0703nobodyさん2005/10/03(月) 02:51:30ID:???
ヒント:オープンモード
0704もな2005/10/03(月) 02:51:39ID:???
ttp://www.error.to/~marty/ss2_bbs/ss2_bbs_img/8_1.txt

です。おねがいしますm(__)m
0705nobodyさん2005/10/03(月) 02:51:47ID:???
>>698
> if($FORM_DATA{'action'} eq 'reqist') {
                    ↑
0706もな2005/10/03(月) 03:04:26ID:???
>>703

オープンモードですか?
+>や>>などですか。調べてみましたが、もはやどうにも;;


>>705

初歩的なミスですね、ありがとうございます。

その部分を registと書き直しましたが
改善しません。
0707nobodyさん2005/10/03(月) 03:33:27ID:???
>>704
入力画面の表示の部分に
<input type="hidden" name="action" value="request">
が抜けている。

そしてなにより、@data_setにいれたログを表示する部分が、ない。
0708もな2005/10/03(月) 03:44:44ID:???

>入力画面の表示の部分に
><input type="hidden" name="action" value="request">
>が抜けている。

今自分で発見しました。ごもっともです・・・。これが原因でした。

>そしてなにより、@data_setにいれたログを表示する部分が、ない。
これはこれから実装予定です。
いまはとりあえずbbs.datに書き込めればいいので。

ありがとうございましたm(__)m
0709nobodyさん2005/10/03(月) 05:25:36ID:AwkrNdbs
神様、お願いします。
CGIの改造を考えていますが、この内容が素人に出来そうでしょうか?
パールの解説のHPを見つけたのと、大昔、BASICをやっていました。

「掲示板に親記事を投稿した人間以外にレスを付けれなくする。」
1、親記事の入力フォームに記事ロックの選択肢を追加。ログデータに
この項目を追加。
2、ロックマーク表示。
3、レス投稿時に親記事番号のログデータを読み込んで、ロックであれ
ばパスワード判定。パスワードは投稿時の物を使用、判定はそのサブル
ーチン流用。
4、エラー処理。(サブルーチンから流用)。
0710nobodyさん2005/10/03(月) 05:36:42ID:???
根性があればできんじゃない?
0711nobodyさん2005/10/03(月) 05:40:27ID:???
>>709
既存のスクリプトは読めてるみたいだしいけると思うよ
0712nobodyさん2005/10/03(月) 18:47:13ID:???
>>710-711
神キター
07137092005/10/03(月) 22:58:15ID:y4rbqtg0
ありがとうございます。頑張ってみます。

ログファイルの読み込み、書き込みが強敵です。なにせ、BASICには無い
概念なので。あとは、他の部分からの流用、小改造でなんとかなりそうなんで
すが。
0714nobodyさん2005/10/03(月) 23:16:50ID:???
やってもらいたいなら、最初からそう書くべきだと思うけど。
07157092005/10/03(月) 23:55:41ID:YGt8QF/s
そういうスレがあるのは知っています。ただ、できたらいいな、ぐらい
なものなので。

とりあえず、ログデータを定義している部分をチェックしたので、そこ
からスタートです!!
0716nobodyさん2005/10/04(火) 11:53:28ID:ibcAkGb+
質問させてください。

@list1 = (1,3,5,7,9,11,13,15,17,19,21,23,25,27,29)
@list2 = (1,4,7,10,13,16,19,22,25,28,30)

と入っています。
ここで
・リスト2の中のものがリスト1にある場合はその値を@list3に、
・リスト2の中のものがリスト1にない場合はその値を@list4に、
それぞれ入れて行きたいと思うのですが、その方法がわかりません。

最終的には
@list3 = (1,7,13,19,25,30)
@list4 = (4,10,16,22,28)
にしたいのです。

@list1〜@list4は便宜上数値にしていますが、実際に入るのは文字列(URL)で、@list1の要素は100以上になる場合があります。@list2はせいぜい5個くらい。
0717nobodyさん2005/10/04(火) 12:19:46ID:???
>>716
ハッシュにいれて調べるのが常套手段。

@list3 = (1,7,13,19,25,30)
@list4 = (4,10,16,22,28)

じゃなくて

@list3=(1,7,13,19,25)
@list4=(4,10,16,22,28,30)

でよければ

@list1{@list1} = ();

@list3 = grep {exists $list1{$_}} @list2;
@list4 = grep {!exists $list1{$_}} @list2;

でいけるけど、30が@list4じゃなくて@list3に入るようにするのは難しいな。
0718nobodyさん2005/10/04(火) 14:23:03ID:???
なんかすげー。

> @list1{@list1} = ();

こんな書き方あるのか。
0719nobodyさん2005/10/04(火) 15:06:23ID:???
>>718
原理としては @hash{'foo', 'bar', 'baz'} と同じなんだが。
07207162005/10/04(火) 15:10:49ID:ibcAkGb+
>>717

30は@list4の間違いです。申し訳ありません。

ハッシュを使うのですね。
ありがとうございました!!
0721nobodyさん2005/10/04(火) 15:12:11ID:???
素人スマソ、生理的に嫌かもしれませんが

$dummy = '/^';
$dummy .= join'$/ || /^',@list2;
$dummy .= '$/';
@list3 = grep(eval $dummy,@list1);
@list4 = grep(!eval $dummy,@list1);
07227212005/10/04(火) 15:16:47ID:???
間違ったので読み飛ばしてください。(鬱
0723nobodyさん2005/10/04(火) 15:21:32ID:???
>>718
スライスはやりすぎのような気がするので、

$list1{$_} = 1 foreach @list1;

ぐらいの方が見やすいんじゃないかねぇ。これだと値が1だから
exists使わずに

@list3 = grep {$list1{$_}} @list2;

みたいに書けるし。
0724nobodyさん2005/10/04(火) 15:45:08ID:???
それならこう書くかな。
my %flag = map { $_ => 1 } @list1;
07257092005/10/04(火) 15:46:59ID:16WUnnwb
第一夜。
まずは入力フォームを追加して、ログデータの項目を追加。
掲示板に投稿して入力値が入っているかテスト。・・・FTPで開いて
みるが、入っていない。試行錯誤するがダメ。もう止めようと思う。

第一夜続き。お風呂でぶくぶくしていると、使っていないname値を流用すれ
ば全部済むことに気がつく。
俺って天才!! さっそく試す。ダメ。

0726nobodyさん2005/10/04(火) 15:47:19ID:???
どうでもいいが >>721 は /^(?:a|b|c)$/ とういうような書き方を知らないのか
0727nobodyさん2005/10/04(火) 15:49:41ID:???
>>709 オツカレw
07287092005/10/04(火) 15:50:20ID:16WUnnwb
第二夜。
よ〜〜〜く見たら、formのnameに「"」がついてないことに気がつく。
再度、投稿してFTPでファイルを開く。

入ってる〜〜〜〜〜!!!!!

新たにログデータの項目を追加した状態で試す。

入ってる〜〜〜〜〜!!!!!
0729nobodyさん2005/10/04(火) 16:38:19ID:???
>>728
ローカルでテストしましょうね。
0730nobodyさん2005/10/04(火) 16:56:19ID:???
とりあえずオメ
07317092005/10/04(火) 17:13:56ID:0ZPYmA+s
ありがとうございます!! 
ところでローカルということは、サーバーに上げなくてもCGIは動く
のですか?

第二夜続き。
過去ログの処理が入っているので、安全を考えてname値の流用の方に決
定。とりあえずクッキーを外したいので、そこだけ消去。動作確認。

レスロック判定をしてロックなら投稿記事にマークを出す。ログデータ
はもともと読み込まれているので、if文を書いてみる。
原文から「!」が逆の判定になるのだろうと推測。

if ((!$reno)&&($sub_color eq "1")) {
 print "[ロック] ";
 }

出た〜〜〜〜〜!!!!
0732nobodyさん2005/10/04(火) 17:47:20ID:???
>>731
プログラムだから動くよ〜。
0733nobodyさん2005/10/04(火) 18:20:23ID:???
>>731
> ローカルサーバ
あの KENT-WEB にさえ 「自宅マシンWWWサーバ化計画」 とやらがあるんだし、いろいろぐぐってみそ
0734nobodyさん2005/10/04(火) 18:31:14ID:???
機種依存文字のチェックルーチンを作っててはまった事実。

---------- ソース(EUC) ----------
use Jcode;
$char = '(1)'; # 機種依存文字の丸1だと思ってください。
print qq(${char}\n);
Jcode::convert( \$char, 'euc' );
print qq(${char}\n);
exit;

---------- 出力(EUC) ----------
(1)
?

文字コード同じでもJcodeかますと機種依存文字が「?」になるんですね…
なんでだろ。
0735nobodyさん2005/10/04(火) 19:35:46ID:???
>>731
ここで日記書く前にCGIの基礎を勉強して来い
つか質問無いなら書くな
0736nobodyさん2005/10/04(火) 19:40:27ID:???
>>734
ウチではそのソースでも「?」にはならないけど
07377342005/10/04(火) 19:49:55ID:???
>>736

まじですか?
ちなみに環境は、

・FedoraCore 3
・Perl 5.8.5
・内部エンコードUTF8(あまり関係ない気がするけど)

です。
0738nobodyさん2005/10/04(火) 19:54:18ID:???
Jcode.pm の ユニコ←→EUC 変換テーブルにない文字なだけじゃね?
07397092005/10/04(火) 20:09:01ID:5HGueAp3
>>735

はあ。プログラマーさんは真面目なんですね。
では、さようなら。アドバイスありがとうございました。
0740nobodyさん2005/10/04(火) 20:51:20ID:???
>>734
エディターで使用してるフォントと結果表示のフォントが違うんじゃない?
同じ文字コードでも後者のフォントには含まれてない文字だとか。
0741nobodyさん2005/10/04(火) 21:16:41ID:???
>>740
Jcode::convertにかける前と後で表示させていて、かける前のは
ちゃんと表示されてるというんだからそれは違うんじゃないかと。

print qq(${char}\n);

のかわりに、

print unpack('H*', $char), "\n";

にして文字コード表示させるとなにかヒントがつかめるかもしれず。

ちなみにうちの環境ではどちらも普通に丸1が表示されてコードは
ada1だった。
0742nobodyさん2005/10/04(火) 21:27:51ID:???
Jcodeは5.8.x以降Encodeのラッパーとして動くとかあるから、
PerlバージョンとJcodeのバージョンによって動作が違うと考えられるけど。
0743nobodyさん2005/10/04(火) 21:47:32ID:???
ああ、そういえば Encode の日本語変換はかなりのヘタレだ。
0744nobodyさん2005/10/04(火) 22:10:19ID:???
なんかヘンだ。
print qq(${char}\n);
は
print $char . "\n";
とか
print "$char\n";
にならんのか?

いや、オフトピだけどさぁw
0745nobodyさん2005/10/04(火) 22:16:13ID:???
俺なら
print $char, "\n";
かな
0746nobodyさん2005/10/04(火) 22:19:58ID:???
>>745
俺も。 なんとなく効率よさそう
0747nobodyさん2005/10/05(水) 01:00:16ID:???
Win2K環境でhoge.txtを作ってから、

open (FH, "<hoge.txt");
print FH "�I";
close FH;

これを実行してエディタで開くと、文字コードがEUCになってしまう
0748nobodyさん2005/10/05(水) 02:26:59ID:???
>747
ここは独り言書き込みスレじゃねえ
0749nobodyさん2005/10/05(水) 03:23:07ID:???
ハッシュのキーにHTMLタグ等を入れる予定なのですが、
キーに指定不可能な文字列というものはあるものなの
でしょうか。

ご教示いただけますと幸いです。
0750nobodyさん2005/10/05(水) 07:42:46ID:???
>>747
文字コードが被ってるだけ。エディタの問題。

>>749
文字列で表すことができれば、なんでもOK。
07517342005/10/05(水) 12:48:09ID:???
>>741

コード出力試したんですが、
見事に
(1) → ada1
? → 3f
でしたw

3fってもろに ? のコードなんだよなぁ…
となるとJcodeの変換テーブルに無い文字は
全部 ? に変換しちゃってるとしか考えようが…

ちなみに Jcode.pm のバージョンは 2.3 でした。
一応現在の最新版を入れたんだけど…



>>742, 743

それは痛い…
まだまだJcode使わざるをえないようですね



>>744, 745, 746

大抵 print するときはPerl変数と通常の文字列が混ざるんで、
qq() でくくって ${} で変数を切り分ける癖が付いてるみたいです。
逆に , や . で結合する方が気持ち悪いと感じてる…
(もちろん、単純な文字列の場合はその限りじゃないですが)

0752nobodyさん2005/10/05(水) 13:03:38ID:???
>>751
qq() と . は、文字列結合があるからなぁ。
, ならIOにそのまま渡るだけだけど。
0753nobodyさん2005/10/05(水) 13:51:44ID:???
>>751
たぶん勘違いしてると思うのだが、新しめのJcode.pmはperl5.8以降と
組み合わせるとコード変換部分をPerlがもともと備えている機構を
使うようになるので、
07547512005/10/05(水) 13:58:42ID:???
>>752

可読性を重視してました…
速度的にはそのとおりですね

>>753

×Jcode
○jcode(.pl)
でした。。
0755nobodyさん2005/10/05(水) 14:06:45ID:???
Debianのunstableで試してみたんだが、パッケージでインストールしたperl5.8.7
とJcode.pmのHPから落としてきた2.03との組み合わせでで確かに'?'になった。
unstableでJcode.pmのパッケージはいまだに0.88なのはその辺を嫌ってるの
かもしれんな。

0756nobodyさん2005/10/05(水) 14:10:46ID:???
>>754
いや jcode.pl は utf-8 ⇔ euc-jp はできんぞ。
07577542005/10/05(水) 14:14:34ID:???
>>756
ソースも出力もEUCなので、UTFからの変換は行ってないです。
(すんません、なんか本題とずれちゃってる…)
0758nobodyさん2005/10/05(水) 15:40:19ID:???
>>750
ありがとうございます。
キーボードで入力できる文字全てが対象なんですね。
良かったです。
0759nobodyさん2005/10/05(水) 16:29:09ID:???
いっそ、jcode.plにするとか
0760nobodyさん2005/10/05(水) 16:35:30ID:???
つか euc ⇔ euc なら変換する必要ないじゃんか。
いきなり convert じゃなくて、getcode で文字コード取得してから自分で判別してやれば「いいじゃない
0761nobodyさん2005/10/05(水) 17:13:12ID:???
>>734 を読んで思ったこと。

>---------- ソース(EUC) ----------
>use Jcode;
ソースはEUCとのことだが、use encoding を宣言していないため、
Perl はこのソースをUTF-8だと認識すると思われ。

>$char = '(1)'; # 機種依存文字の丸1だと思ってください。
$charには、「『丸1』のEUCコード」が入る。但し、PerlはこれをUTF-8の
文字コードだと認識する。

>print qq(${char}\n);
PerlがUTF-8の文字コードだと認識している「『丸1』のEUCコード」が出力される
ため、出力結果は見かけ上は正常に見える。

>Jcode::convert( \$char, 'euc' );
これは、「『丸1』のEUCコード」をUTF-8の文字コードだとして、対応する
EUCコードを返せ、ということになるが、そんなものが無いために「?」が
返されるのではないだろうか。
0762nobodyさん2005/10/05(水) 17:35:41ID:???
>>761
use utf8してないからそんなこたないと思うが。
0763nobodyさん2005/10/05(水) 18:06:34ID:???
use Encode qw(from_to);

euc2euc("\xad\xa1");
euc2euc("\xdb\xd9");
exit;

sub euc2euc
{
my $char = shift;
from_to($char, 'euc-jp', 'euc-jp');
print ((map{ unpack('H2', $_) } split(//, $char)), "\n");
}

これを動かしてみれば分かると思う。
結局、○に1とかの文字を渡さないのがいいかと。
0764nobodyさん2005/10/05(水) 19:43:50ID:???
>>763

なるほど。
ということはEncodeを使うコード変換(Perl5.8以上のJcode含む)に
機種依存文字を渡してはいけないってことですね。
※5.8以下のJcodeとjcode.plは不明

うーん、、機種依存文字の判定はしんどいなぁ…
0765nobodyさん2005/10/05(水) 21:14:51ID:???
>>764
CPANにあるEncode::JIS2K使うとか。詳しくはわかんないけど
試した感じでは丸付き数字ぐらいならなんとかなるっぽいよ。
0766nobodyさん2005/10/05(水) 21:36:18ID:???
すいません。ご指導おねがいいたします。
クイズのプログラムを作っているのですが、csvへの書き込みが思うようにいきません。。
↓とりあえず現状はこうなっています。
ttp://s1.muryo-de.etowns.net/~testjoy/

このまま回答を送信すると

項目1 項目2 項目3
総問題数 回答番号 正解番号
総問題数 回答番号 正解番号
・   ・   ・
・   ・   ・

と書き込まれるのですが、これを

項目1 項目2 項目3
Q1(問題番号) Q1の回答番号 Q1の正解番号
Q2(問題番号) Q2の回答番号 Q2の正解番号
Q3(問題番号) Q3の回答番号 Q3の正解番号
・   ・   ・
・   ・   ・

という形に修正したいです。ここまでやってどうしてもうまくいきません。。。
どなたかお助けお願い申し上げます。
07677662005/10/05(水) 21:37:30ID:???
おかしいとこのソースは

foreach (@question) {
($rank_data) = split(/\t/);

open(CSV , ">> file.csv");
flock(CSV,2);
@logs2=<CSV>;
$rank_data="$key,$val,$aval\n";
push(@logs2,$rank_data);
print CSV @logs2;
flock(CSV,8);
close(CSV);
}

です。お願い申し上げます。。
0768nobodyさん2005/10/05(水) 21:42:47ID:???
>>767
問題が再現する最小のサンプルコードを載せるべし。
0769762005/10/05(水) 21:52:03ID:???
>>768
こんな具合でございます。。

# 質問の取得

&ReadParse;

if(open(IFILE,"question_1.tsv")) {
while(<IFILE>) {
chomp();
push(@question,$_);
}
close(IFILE);
07707672005/10/05(水) 21:54:07ID:???
# 質問の表示

my($qnum) = 0;
foreach (@question) {
($qval,$aval,@column) = split(/\t/);
next if($qval eq "");

$qnum++;
$key = "Q".$qnum;

【問題$qnum】$qval

!;

$anum = 0;
foreach (@column) {
next if(!$_);
$anum++;
print qq!<BR>\n!;
print qq!<INPUT TYPE="radio" NAME="$key" VALUE="$anum">$_\n!;
}
07717672005/10/05(水) 21:58:19ID:???
# 回答の表示

my($qnum) = 0;
foreach (@question) {
($qval,$aval,@column) = split(/\t/);
next if($qval eq "");

$qnum++;
$key = "Q".$qnum;
$val = $in{$key};
if($val eq $aval) {
$check = "○";
} else {
$check = "×";
}

$anum = 0;
$answer[$anum] = " ";
foreach (@column) {
next if(!$_);
$anum++;
$answer[$anum] = $_;
}
0772nobodyさん2005/10/05(水) 22:30:09ID:Y4Xwvx08
質問させてください。
最近サイトの荒しが多くて、IPとホストのドメインを取得しようとしています。
$ENV{'REMOTE_ADDR'}
$ENV{'REMOTE_HOST'}
で情報を得ようとしているのですが、REMOTE_ADDRの方は値が入っているのに、
REMOTE_HOSTの方は何も入っていません。ローカル起動ではないのですがなぜ
でしょうか?プロバイダの違う複数の端末からもためしてみたのですが、入っ
ていませんでした。
よろしくお願いします。
0773nobodyさん2005/10/05(水) 22:45:29ID:???
>>772
つながってきた相手のIPアドレスは必ずわかるけど、
ホスト名はIPアドレスからDNSで逆引きしないと
出ないので、出そうとするとその分鯖の負荷になる。
なので、特に共用の鯖では逆引きしない設定にして
あることが多い。多分それじゃないかと。

0774nobodyさん2005/10/05(水) 23:15:07ID:???
つまりこっちで関数使って逆引きすればいいってことね。
0775nobodyさん2005/10/06(木) 03:58:29ID:???
げっとほすとばいあどれす
0776nobodyさん2005/10/06(木) 11:31:35ID:???
>>764
> 機種依存文字
Shift_JIS だけど、
どこかに

/([\x85-\x87][\x40-\xff]|\x88[\x40-\x9e]|[\xeb-\xfc][\x40-\xff])/;
って書いてあった。
0777nobodyさん2005/10/06(木) 11:54:16ID:???
>>767
foreach (@question) のループの中で、$key, $val, $aval
が全く変更されていない。従って、$rank_dataは常に同一の
文字列になる。もしかすると、
($rank_data) = split(/\t/); を、
($key,$val,$aval) = split(/\t/);
にすれば、望んだ結果が得られるかもしれない。
0778nobodyさん2005/10/06(木) 13:20:28ID:Zoab/OuC
$db = PP->db;

$st = $db->prepare("$C{sqlbase} and ch=? and subch!='notice' and pubtime > now() - '1 day'::interval order by pubtime desc");

すいません、↑この一文は何をしているんでしょうか?
perlの文章の中に出てきたのですが、これはSQLの文の一部なんでしょうか
0779nobodyさん2005/10/06(木) 20:10:40ID:???
>>778
PPクラスのdbメソッドの返値が代入されている$dbに対して
prepareメソッドを一つの引数とともに呼び、その返値を$stに代入してる。
引数は普通の文字列で、$C{sqlbase}が変数展開される。

SQL文の一部かどうかはそのプログラムを書いた人じゃないので知らん。
■ このスレッドは過去ログ倉庫に格納されています