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

このエントリーをはてなブックマークに追加
952nobodyさん:2005/10/14(金) 06:40:23 ID:???
953939:2005/10/14(金) 12:01:06 ID:???
>>940-941
ありがとうございました
もっとよく調べればよかった・・・orz
954766:2005/10/14(金) 14:02:22 ID:???
>>950

レス有難う御座います。ほんとうに感謝です。


やっぱり配列の初期データ違いますよね。。。orz


この場合は何をいれたらいいんでしょうか?
$valは自分の選択した解答番号、&avalは正解解答番号
なので、これでいいとおもったんですが。。。

oreach my $k (keys %in) {
$in{$k} =~ s/\x0D?\x0A/<br>/g;
}
とか &ReadParse; の後に。。。

ていうのもどこにそのそーすいれたらいいのか
わかりません。。

955766:2005/10/14(金) 14:05:19 ID:???
現状

# 回答の表示

  my($val) = ????; ←不明
   my($aval) = ????;  ←不明
my($qnum) = 0;
foreach (@question) {
($qval,$aval,@column) = split(/,/);
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] = $_;
       }


956766:2005/10/14(金) 14:06:55 ID:???
push (@val, $val);
push (@aval, $aval);
} # pushしたらforeach (@question)のブロックは終わり

#csvへの書き込み
open(WRITE_BBSDAT , ">> file.csv");
print WRITE_BBSDAT join(',', $in{name}, @val), "\n";
print WRITE_BBSDAT join(',', '', @aval), "\n";
close(WRITE_BBSDAT);
957nobodyさん:2005/10/14(金) 20:23:06 ID:???
がんばれ >>950
958nobodyさん:2005/10/15(土) 05:56:59 ID:???
>>954-956
おまい…配列(@)とスカラ($)を混同してるだろ…
初期化のところは何も入れなくて良いんだよ。中身はpushのところで入れてるんだから
my @vals = ();
my @avals = ();
で。むしろ混乱しているならこの部分自体なくてもよろしい

> ていうのもどこにそのそーすいれたらいいのか
だから&ReadParse;の後だって。>>923のソースの一番最初にあるでしょ

ってか、そのソースなら間違ってるところもあるがとりあえずは動くはずなんだが…
ソース全体をうpして見たらどうだろう。期待する出力結果についても、$valとか使わず、
実際にどういう風に出力されて欲しいのかを具体的に書いてもらえないと多分みんな分かってない。
漏れの認識としては、
1問目の正解:1 1人目の回答:2 2人目の回答:3
2問目の正解:2 1人目の回答:3 2人目の回答:1
3問目の正解:3 1人目の回答:1 2人目の回答:2
なら
----------------------
1人目の名前,1,2,3
,2,3,1
2人目の名前,1,2,3
,3,1,2
----------------------
という感じなんだが…

漏れの説明能力も限界ですorz 誰か他の人に任...
959nobodyさん:2005/10/15(土) 13:04:17 ID:???
乙w
とりあえず誰かが作ったほうが早いことはわかったw
960nobodyさん:2005/10/15(土) 14:18:15 ID:???
phpからの移行かなぁ。
アレだと配列もスカラもハッシュも$だからなぁ。(あの仕様はどうかと思う)
961nobodyさん:2005/10/15(土) 14:28:17 ID:???
他の言語は $ すらつかないのも多々あるけど、
どうせ $ つけるなら perl に合わせてくれてもいいのにな、とは思った。
962nobodyさん:2005/10/15(土) 15:59:18 ID:vVuUdULb
CSV形式のログファイルで掲示板を作ったのですが、
改行をどうしようか悩んでます。

\nなどを見つけたら<br>にしてから書き込んで見ました。
しかし読込表示処理の法で、HTMLエスケープしてるので<br>がエスケープされてしまいました。

それで改行を<br>以外にちかんして、読み込むときにそれを<br>に戻してやろうと思いました。
で、何に置換するかで悩んでます。

いまのところ\tとかしかないかなと思ってますが、ほかにもっといいのはありますか?
963962:2005/10/15(土) 16:19:46 ID:vVuUdULb
返事ないか・・・
もういいや
964nobodyさん:2005/10/15(土) 16:27:50 ID:???
&#13; とかオススメ。 今考えたけど。
つか最近こらえ性の無い人が多いですね。
965nobodyさん:2005/10/15(土) 16:33:09 ID:???
いやそれ以前の問題でっしゃろ・・・二十分て
# 回答員はこのスレべったり張り付いてるわけじゃないということをry

phpBBに習った構造なんかもありだと思うよ。[br]みたいにしておいて出力時にtr/[]/<>/
こっちのほうがちと冗長だけど汎用性はある
966nobodyさん:2005/10/15(土) 16:51:14 ID:???
次は10分だな。

ちなみに俺の回答は読み込み表示処理の見直しかな。
967nobodyさん:2005/10/15(土) 17:30:53 ID:???
回答員ていいなw 点呼したら5人くらいしかいなさそうだが
エンティティは書き込み時に行うのが一番いいと思うなり
968nobodyさん:2005/10/15(土) 17:31:58 ID:???
>964-966
掲示板とはどういうものかすらわかってない池沼はスルーで。
969nobodyさん:2005/10/15(土) 17:50:45 ID:???
うむ、HTMLエスケープ → \n 直し → ログ書き込み → ログ読み込み ってやればそんなことおきないもんな
970nobodyさん:2005/10/15(土) 18:07:03 ID:???
/\\/\\\\/g; /\r?\n/\\n/g;
もいいかもね。
971nobodyさん:2005/10/15(土) 18:38:22 ID:???
>>970
そうすると 'hogehoge\n\\n<改行>' と書いたときに 'hogehoge\\n\\\\n\n' ってなるんだけど、
一発で '\\n' や '\\\\n' にマッチしないで '\n' だけにマッチするのって難しくない?
972nobodyさん:2005/10/15(土) 20:53:21 ID:???
>>971
えっと、言ってる意味がよくわからないんだけど、コレじゃダメかな?

$txt = "hogehoge\\n\\\\n\n";
$txt =~ s/\\/\\\\/g; $txt =~ s/\r?\n/\\n/g; # escape
$txt =~ s/\\(.)/($1eq'n')?"\n":$1/ge; # unescape
973nobodyさん:2005/10/15(土) 23:27:59 ID:???
例えば
<f\o\r\m \n\a\m\e="test" />
こうなってるHTMLタグから\を消そうと思い

$str = '<div>\\<f\o\r\m \n\a\m\e="test" />\\<br />';
$str =~s/(<[^>]*)?\\([^<]*>)/$1$2/g;

とやったのですがうまくいきません。結果として$strには

<div>\\<form name="test" />\\<br />

と、タグ内だけの\を省きたいのですがどのようにすればよいでしょうか?
974nobodyさん:2005/10/15(土) 23:41:42 ID:???
>>973
ここでの問答や今やってる事を全て忘れて、
入門書を一冊買って読めばいいんじゃないかな。
もしくはつきっきりで教えてくれる人でも探すとか。
今の状態だと何スレ消費しても先に進まなそうだし。
975nobodyさん:2005/10/15(土) 23:43:09 ID:???
Perlコーディングに関係ねーし
976nobodyさん:2005/10/15(土) 23:49:17 ID:???
>>974
その反応待ってました。と言う事は難しく考えなければいいのか。
久々にやるから基本忘れてしまった・・・
977nobodyさん:2005/10/15(土) 23:51:09 ID:???
時々でいいから正規表現道場の事を思い出してあげてくださいです・・・
http://pc8.2ch.net/test/read.cgi/php/1105930285/
978nobodyさん:2005/10/16(日) 00:09:56 ID:???
>>973
タグ内だけ処理がしたいと。

my $str = '<div>\\<f\o\r\m \n\a\m\e="test" />\\<br />';
my @tag = ();
$str =~ s/(<.*?>)/push(@tag,$1);'<>';/eg;
foreach (@tag) {
s/\\//g;#好き勝手に処理
}
$str =~ s/<>/shift(@tag);/eg;

そもそもなんでそんな処理が必要なの?仕様の方を疑っちゃうよ。
979nobodyさん:2005/10/16(日) 00:33:05 ID:???
>>978
サンキューです。
深い意味は無いですが、昔Perl使ってたの思い出してもう一度使おうかと思いとりあえず正規表現思い出すために自分で作った例題みたいな。
980nobodyさん:2005/10/16(日) 18:58:16 ID:???
>>973
その正規表現で最初のキャプチャはこう
<div>\\<f\o\r\m \n\a\m\e="test" />\\<br />
     |←   $1   →| |← $2  →|
\e が最初なのは [^>]* が \ も食う最大マッチだからね
で、formタグ側は既にマッチし終えたから
(gオプションの)次はbrの方に行っちゃうのが一番大きい間違いだと思う
あとシングルクォート内でも \\ は \ に置き換えられるよ

gを使うならルックアラウンドアサーション使うか
1 while $str =~ s///; の形にするか
>>978のように2段階に分けて
sub myfunc { my $tmp = shift; $tmp =~ s/\\//g; $tmp; }
$str =~ s/(<[^>]*>)/ myfunc($1) /eg;
とかすればいいと思う
981766:2005/10/16(日) 21:56:12 ID:???
>>958

わけわかってなくてほんとうにゴメンなさい。。レス有難うございます。
csvに書き出して、それをDLしてExcelで開いたときに表示させたいのは、

1人目の名前: name1
その人の1〜3問目の回答番号: hoge1, hoge2, hoge3,
1〜3問目の正解番号: anser1,anser2,anser3

2人目の名前: name2

とすると

name1、hoge1, hoge2, hoge3,
”空欄”,anser1,anser2,anser3
name2、hoge1, hoge2, hoge3,
”空欄”,anser1,anser2,anser3

です。

現状は
name1、hoge1
”空欄”,anser1
name1、hoge2
”空欄”,anser2
name1、hoge3
”空欄”,anser3

て縦に並んでしましまいます。。


982766:2005/10/16(日) 22:17:35 ID:???

今の全ソースです。普通のFORM POST .htmlから飛ばしてます。
【question1.cgi】

#!/usr/bin/perl
require "cgi-lib.pl";
# 質問の取得

&ReadParse;
foreach my $k (keys %in) {
$in{$k} =~ s/\x0D?\x0A/<br>/g;
}

if(open(IFILE,"question_1.tsv")) {
while(<IFILE>) {
chomp();
push(@question,$_);
}
close(IFILE);
} else {
&Print_Error("質問設定ファイルを読み込めませんでした。");
}


983766:2005/10/16(日) 22:18:42 ID:???
# 回答ページの表示
print "Content-type: text/html\n\n";
print qq!
<HTML>
<HEAD>
<META Http-Equiv="Content-Type" Content="text/html;charset=EUC-JP">
<TITLE>回答</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<TABLE BORDER=1 WIDTH="800px" BGCOLOR="#ffffff">
<TR BGCOLOR="E2E2EE">
<TD WIDTH="60px"><FONT SIZE=2><B>質問番号</B></FONT></TD>
<TD><FONT SIZE=2><B>あなたの回答</B></FONT></TD>
<TD WIDTH="50px"><FONT SIZE=2><B>結果</B></FONT></TD>
</TR>
!;

984766:2005/10/16(日) 22:19:34 ID:???
# 回答の表示

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] = $_;

}

push (@val, $val);
push (@aval, $aval);
985nobodyさん:2005/10/16(日) 22:23:39 ID:???
何レスも使うんだったらどっかにうpしる
986766:2005/10/16(日) 22:25:05 ID:???
# csvへの書き込み
open(WRITE_BBSDAT , ">> file.csv");
print WRITE_BBSDAT join(',', $in{name}, $val), "\n";
print WRITE_BBSDAT join(',', '', $year), "\n";
close(WRITE_BBSDAT);

print qq!
<TR BGCOLOR="#ffffff">
<TD><FONT SIZE=2><B>$key</B></FONT></TD>
<TD><FONT SIZE=2>$val</FONT></TD>
<TD><FONT SIZE=2>$aval</FONT></TD>
</TR>
!;
}

print qq!
</TABLE>
</HTML>
!;

あとこれに名前がはいっていなかったら送信できないようにする機能も
つけたいです。。

csvの書き込みと名前はいってなかったらエラーが動いたら完成なんです。
perlとかこれがほんとに初めてで、なんとかここまでやりました。。
どうかご指導お願いいたします。。実は仕事なんです。助けてください。。泣
987nobodyさん:2005/10/16(日) 22:31:22 ID:???
よもまつだな。
988nobodyさん:2005/10/16(日) 22:38:54 ID:???
>>986
おまいのコードのデバッグをしてやるスレじゃないよ。

問題が再現する最短のコードを載せるべし。

> 今の全ソースです。

今の全ソースなど載せるなよ。
989766:2005/10/16(日) 22:51:45 ID:???
みなさんのおっしゃるとおりです。。スレの無駄遣いすいません。。
990nobodyさん:2005/10/16(日) 22:59:21 ID:???
>>987の日本語が釣りであることを願う
991nobodyさん:2005/10/16(日) 23:04:21 ID:???
>>990が釣りであることを願う
992nobodyさん:2005/10/16(日) 23:45:46 ID:???
>>766
手伝ってやろうかとも思ったが「仕事」の二文字を見た瞬間にその気が失せた。
おまいもう少し考えて行動汁。
993766:2005/10/16(日) 23:51:24 ID:???
すません。。ここしかたよるところがなくて。。なんとかご指導願えませんでしょうか?ヒントだけでも結構です。後は自分でなんとかしたいと思っています。

何卒宜しくお願いいたします。。
994nobodyさん:2005/10/16(日) 23:56:43 ID:???
ヒントならいっぱい出てるし。
がんばって勉強してください。
仕事ならなおさらです。
995nobodyさん:2005/10/16(日) 23:59:50 ID:???
>>766
正直、このスレに完璧な答えが出てる。
これでわからないならもうその仕事は破棄しなさいな。
それが先方とお前の為だよ。
996nobodyさん:2005/10/17(月) 00:15:20 ID:???
え、仕事をこのスレで質問?
よもまつですな。

ヒキがいうのもなんだけど。
997932=950=958:2005/10/17(月) 00:45:14 ID:???
すまん、ソース全うpを提案したのは漏れだ。
>>766のところに上げて欲しかったんだけどな…

とりあえず次スレたててくる
998nobodyさん:2005/10/17(月) 00:48:33 ID:???
Perlコーディング初心者質問スレ Part 44
ttp://pc8.2ch.net/test/read.cgi/php/1129477637/
999nobodyさん:2005/10/17(月) 00:48:38 ID:???
仕事は今週中に   あと2日もあれば
やるぞ♪         余裕余裕         週末家で・・・        怒られればいいか・・・
  ∧∧    ∧∧      ∧∧  . .::::::::::::::::::::::::::┃::::::::::::::::::::::::::::::::::::::::::::  ∧||∧
 (・∀・)  ∩・∀・)   (・∀・)∩..::: ∧∧:::::::::::┃:::::::::::::::::::::::::::::::::::::::::::::::::(  ⌒ヽ
 / ⊃⊃ ヽ  ⊃ノ  /⊃  / .. :::('д` )::::::::┃::::∧ ∧::::::::::::::::::::::::::::::::::: ∪  ノ
 (  (    ヽ  )つ〜( ヽノ ...:::と  ヽ::::::::┃: ('д` )::::::(   )⌒ヽ;:::::::::: ∪∪
  (/(/'    (/     し^ J.. ...:::⊂,,_UO〜:┃:::(∩∩ ):::::|/.|/uと  )〜:::::::::::::::
      まだ2日間しか     残業すれば・・・    2chで聞けば・・・
                                         ↑
                                        今ここら辺
1000nobodyさん:2005/10/17(月) 00:49:51 ID:???
次スレたってる模様

Perlコーディング初心者質問スレ Part 44
http://pc8.2ch.net/test/read.cgi/php/1129477637/
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。