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

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

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001nobodyさん2005/08/12(金) 01:26:47ID:mHnZWvqz
Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
0876nobodyさん2005/10/11(火) 23:08:27ID:???
>848
激しくありがとう!
0877nobodyさん2005/10/11(火) 23:25:44ID:???
>>874
http://homepage1.nifty.com/nomenclator/perl/shiftjis.htm#errors
の、「マッチするはずなのにマッチしない (1)」
0878nobodyさん2005/10/11(火) 23:28:54ID:???
>>874
quotemeta 使え
0879nobodyさん2005/10/11(火) 23:33:36ID:???
それよりもSJISやEUCの違いに触れてやった方が、
今後のためにもいいんじゃないのか
0880nobodyさん2005/10/11(火) 23:39:41ID:???
quotemetaが何をするかを調べれば自ずと分かるから、良い回答だと思うけど。。
今後は結局本人次第かと。
08818202005/10/12(水) 00:22:26ID:???
宿題は昔から自分でやれという決まりですよね。。。と、いうことで、一応できたので載せときます・・・念のため。。。
#!/perl
print "Please enther the decimal number which is between 0 and 255\n";
my $input = <STDIN>;
if ($input >= 127) {print "1";
$input = $input - 126;
}else{print"0";}
if ($input >=64){print"1";
$input = $input - 64;
}else{print"0"; }
if ($input >=32){print"1";
$input = $input -32;
}else{print"0"; }
if ($input >=16){print"1";
$input = $input -16;
}else{ print"0"; }
if ($input >=8){print"1";
$input =$input -8;
}else{print"0"; }
if ($input >=4){print"1";
$input = $input -4;
}else{print"0"; }
if ($input >=2){print"1";
$input =$input - 2;
}else{print"0"; }
if ($input >=1){print"1";
$input =$input -1;
}else{print"0"; }
IF使う方法しかどうしても解りませんでした・・・なにはともあれ御指導ありがとうござました。
0882nobodyさん2005/10/12(水) 00:23:12ID:???
久々に目がくらんだ
0883nobodyさん2005/10/12(水) 00:28:47ID:???
ビックリ!
0884nobodyさん2005/10/12(水) 00:38:54ID:???
>>881
俺が直してやるよ。
Please input a number between 0 and 255.
0885nobodyさん2005/10/12(水) 00:41:00ID:???
自分でやれってか友達いねーのかよと。
0886nobodyさん2005/10/12(水) 00:50:53ID:???
>>881
>>864のバグはわかったの?
0887nobodyさん2005/10/12(水) 00:52:30ID:???
>>886 優越感に浸りたいだけの馬鹿は嫌われるぞ。
08888862005/10/12(水) 00:55:45ID:???
>>887
(°Д°)ハァ?
バグがあるからあると指摘しているだけだけど…
優越感に浸りたいのはお前だろ!
0889nobodyさん2005/10/12(水) 01:11:03ID:???
>>888
わかったからその目がキモい顔文字を引っ込めてからまた来ような
0890nobodyさん2005/10/12(水) 02:02:11ID:???
>>881
ヒント:pack/unpackの"B"。
08918712005/10/12(水) 02:14:08ID:???
>>881
ちょwwwおまwwwwwビット演算子使えって言われてるのに
どうしてそういう答えになるんだよw ビットシフト使うんだよw
おまい授業ちゃんと聞いてないだろ。ちょと必死に基礎から勉強しなおせ
0892nobodyさん2005/10/12(水) 02:36:00ID:???
しかし if すら習ってないのに、あまり使わないビット演算なんか教えるんだ?
変わってる気がするのは俺だけか。
まあ hex や oct も習ってるしその延長かなあ。
perl なんだから、もっと目的があって作ってて楽しいことから教えればいいのに、って思っちゃう。
0893nobodyさん2005/10/12(水) 03:01:29ID:???
>>892
IFとかの基礎部分を習ったのに忘れてるだけだと思う
0894nobodyさん2005/10/12(水) 05:26:24ID:???
お手軽なperlを使ってbit処理の概念とかを学ばせようとしている希ガス
つかif文使うにしても>>881はあんまりだろw
0895nobodyさん2005/10/12(水) 11:38:44ID:???
確かに、ビット演算子を使わなくていいなら、これで決まりだよな。

my $input = <STDIN>;
printf ("\nbinary = %b", $input);
0896nobodyさん2005/10/12(水) 12:02:57ID:fQz+s6Mx
配列から特定の値をとりだすにはどうしたいいですか?

たとえば@dataの中にあいえおかきけこさしすせそ
が入ってるとします。「け」の文字だけ抜き出して$keにいれる
のはどうしたいいですか?順番が変わらないで$data[6]と添え字にすればいいかも
しれませんが、「け」の位置がいつもそことは決まってないんです。
先頭に来る場合もあれば、2番目にくる場合もあるんですね。

こういう場合、配列から取り出したい文字列を抜き出すのはどうやったら
いいのでしょうか?

ご教授お願いいたします。
0897nobodyさん2005/10/12(水) 13:00:06ID:???
>>896

@dataを使う必要はない。
$ke = 'け';
0898nobodyさん2005/10/12(水) 13:32:50ID:???
たしかに取り出したい文字列があらかじめわかっているなら
取り出す必要はないよなw
0899nobodyさん2005/10/12(水) 15:39:29ID:???
なななんだ!?>>896はつりだったのか!?
0900nobodyさん2005/10/12(水) 16:08:46ID:???
>>881
>宿題は昔から自分でやれという決まりですよね。。。

本来はそうなのだが、今回は特別だ。
教官が感激してくれるようなものを作ってやったぞ。

print "input number: ";
my $input = <STDIN>;
printf ("\n【照合用】 %08b", $input);

print "\nmybinary = ".binconv(0x80, $input);

sub binconv{
my ($binseed, $input) = @_;
return ($binseed ||"") && (($input & $binseed) && 1).binconv($binseed >> 1, $input);
}
0901nobodyさん2005/10/12(水) 16:19:17ID:???
>>900先生!
print "input number: ";
my $input = <STDIN>;
printf ("\n【照合用】 %08b", $input);
これだけでもいいかと思うんですが…
>>820の教官の問題にも問題があると思ってるのは漏れだけですか?
0902nobodyさん2005/10/12(水) 18:37:38ID:???
>>901

>>900 の回答は、>>866 の宿題に対するものだけど、
「ビット演算子を8回使う」という条件があるみたいだから、
printfの出力はあくまでも参考のみ。
09039012005/10/12(水) 18:55:56ID:???
>>902
>>900先生のコードはすばらしいと思うのですが…
なんでこんな問題を…と少し思ったしだいです。
>>820がどんな教科書で勉強してるのかも興味ありです。
0904nobodyさん2005/10/12(水) 19:14:52ID:???
ハッシュって値を格納した時点で箱の中のランダムの枠内に
入れられてしまうので、その後に入れた順番でソートをかける
ことは不可能という認識で間違いございませんでしょうか。
0905nobodyさん2005/10/12(水) 19:50:30ID:???
>>904
ハッシュを eash/keys/values/配列コンテキスト等で読み出した
際の順序は、人間にとっては一見ランダムだが、perl 自身に
とってはランダムではないし、何回呼んでも必ず同じ順序になる。

入れた順序に関係なく、目的の値を分かり易い名前で素早く取り
出せるように作られているのが今の perl の実装なので、入れた
順序が重要なら、それに適したデータ構造 -- 配列を利用するか、
Tie::IxHash のようなラッパーを使う。
09068202005/10/12(水) 22:09:26ID:???
>>900
すごいプログラムありがとうございます。
ですが宿題はすでに提出してしまいました。。
なので今後の参考にさせていただきます

>>903
使ってる教科書は学校でSubject毎に買わされる・・・なんていうんでしょう・・・。
70ページくらいのノートブック?っといったほうがいいかもしれません。

学校はオーストラリアのCollegeで日本で言う職業訓練校を低レベルにしたみたいなとこでしょうか・・・。
今回のSubjectの題名がNetwork Application Solution でこの教科書の2/3程がPerlについて、
残りがVBのDebuggingについてとか、あとはJAVAはなんだ、ActiveXはなんだProxyServerがどうとか
いう説明がちょちょってあるほんとにみすぼらしい構成になっております。
ちなみにこの教科書にはIFとかの説明は載ってません。
さらに今回のSubjectはALL Selfstudyなので先生はまったくと言ってイイほどなにも教えてくれません。
ここに書いた二つの問題はこのエセ教科書の”Acitivy"からの問題です。

以上の理由により、多少奇抜な内容になっています。>>903 さんが興味をもったのもうなずけます・・・。

なにはともあれPerlのセクションの宿題は今回ので無事全部終わりました。
レスくれた皆様ありがとです!
0907nobodyさん2005/10/12(水) 22:12:57ID:???
オーストラリアか。。
0908nobodyさん2005/10/12(水) 22:19:58ID:???
夜中の12時オーストラリアの地図を描く
0909nobodyさん2005/10/13(木) 00:17:06ID:???
NULL文字を正規表現で表すとどのようになるのでしょうか。

ご教示いただけますと幸いです。
09109032005/10/13(木) 00:29:57ID:???
>>906
なるほど。そうでしたか…何か妙な感じがしたんですよね。
お疲れ様でした&今後もがんばってください。
0911nobodyさん2005/10/13(木) 00:32:47ID:???
>>909
NULLという文字列?NULL定義された変数?
definedが知りたいのかな?
09129092005/10/13(木) 00:33:27ID:???
すみません。
やりたいことは、QUERY_STRINGの判定に
(\W|)c=3
このようなイメージの指定をしたいのですが、ようは英数字以外が
cの前にきた場合と「?c=3」と前に何もない場合を指定したいという
ことです。

説明下手ですみません。
0913nobodyさん2005/10/13(木) 00:34:52ID:???
>>911
Cの文字列のターミネータになるASCIIコード0のことじゃなかろか

ということで>>909
/\0/
0914nobodyさん2005/10/13(木) 00:37:18ID:???
>>912
ああ、失礼、それなら先読み否定アサーションを使うべし
(?<!\w)
0915nobodyさん2005/10/13(木) 00:40:44ID:???
>>820 のperlの勉強は終わったらしいが、まだ perl の p も始めてない気がするなあ。カワイソス。
0916nobodyさん2005/10/13(木) 00:42:22ID:???
CPU食わないで指定秒ストップさせることは出来ますか?
sleepだと5%ぐらい使ってしまってるみたいで・・・
09179142005/10/13(木) 00:43:52ID:???
後読み否定だったorzハズカシス
ついでだから>>912のようにやるならばという別解も書いとこう
(^|\W)
09189092005/10/13(木) 00:46:02ID:???
>>913-914
ご教示有難うございます。
ぐぐって調べてみましたが、どうやらこれは

(?<!...) ゼロ幅の否定後読み表明

みたいですね。
私には少し敷居が高そうなので、もう少し勉強してみます。
とにかく有難うございます。
09199092005/10/13(木) 00:52:49ID:???
>>917
すみません、行き違いになりました。
なるほど、と試してみましたが、なぜか引っかからなくなって
しまいました。

調べてみます。
09207662005/10/13(木) 00:53:02ID:???
>>777 766です。大変遅ればせながら
09219092005/10/13(木) 01:00:44ID:???
経過報告です。

× (^|\W)c=1
× (^)c=1
○ ^c=1

なんででしょうね。。
もう少し調べてみます。
09227662005/10/13(木) 01:07:08ID:???
↑Enterで書き込みになってた。。。スレ汚しすません

>>777
遅ればせながらレス有難うございます。
しかしながらいまだcsvへの書き込みが上手くいきません。。

やりたいのは、csv開いたときに

名前,Q1の回答,Q2の回答,Q3の回答。。。。
空欄,Q1の正解,Q2の正解,Q3の正解。。。。

と横並びにカンマ区切りで出したいのですがいろんなソースを入れてみても
上手くいきません。。泣
しかも名前を普通にFORM POSTからとりたいんだけど、どこにソース入れてもエラーになる。。

09237662005/10/13(木) 01:08:08ID:???
現在のソース要約はこんなのです。(.incのファイルはやめて普通にhtml→cgiにした。)

【question_1cgi】
# 質問の取得

&ReadParse;

if(open(IFILE,"question_1.tsv")) {
while(<IFILE>) {
chomp();
push(@question,$_);
}
close(IFILE);
}



09247662005/10/13(木) 01:09:22ID:???
# 回答の表示

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] = $_;
}
09257662005/10/13(木) 01:09:56ID:???
# csv書き込み
open(WRITE_BBSDAT , ">> file.csv");
print WRITE_BBSDAT"ここがわかりません。。。";
print WRITE_BBSDAT"$val,$aval ←じゃ縦にならんじゃう。横にそれぞれ上下で表示したい。";
close(WRITE_BBSDAT);


どなたかお助けください。。お願い申し上げます。
0926nobodyさん2005/10/13(木) 01:12:17ID:???
何が × なんだ?

my $query = 'c=0&d=1';
とか
my $query = 'ac=1&c=0&dc=0';

c=0 だけにマッチさせたいんだよな?

if ($query =~ /(?:^|(?<=\W))c=0(?:(?=\W)|$)/) {
print 'ok?';
}
でない?
0927nobodyさん2005/10/13(木) 01:13:53ID:???
>>921
ありゃ、もしかしてPerlのバージョンが古いと動かなかったりするのかな
バージョンいくつか分かる?とりあえず5.6.1と5.8.7では動作したけど・・・
Perl4探してこよう・・・
09289262005/10/13(木) 01:14:07ID:???
>>921 ね
09299092005/10/13(木) 01:18:14ID:???
>>926
おっしゃるとおりの条件にマッチさせたいと思っております。
そしてご回答有難うございます。
ちょっと私にはもう少し理解する時間が必要になりそうですが、
一つ一つ勉強していきたいと思います。有難うございます。

>>927
v5.8.4ですので、バージョンは問題ないかと思います。
検証してみます。お手数おかけしましてすみません。
0930nobodyさん2005/10/13(木) 01:28:27ID:???
>>929
$query =~ /(?:^|(?<=\W))c=0(?:(?=\W)|$)/

分解すると

:^c=0 : $query の最初に c=0 があるとマッチ
(?<=\W)c=0 : c=0 の前に "[_0-9a-zA-Z] 以外" があったらマッチ
c=0(?=\W) : c=0 の後に "[_0-9a-zA-Z] 以外" があったらマッチ
c=0$ : $query の最後に c=0 があるとマッチ

(c=0(?=\W)) ってやらないで (c=0\W) ってやると、$1 に \W の文字が入ってしまうし、次のマッチの開始も \W の後の字からになってしまう。

つか正規表現スレにいくのはどうか。
0931nobodyさん2005/10/13(木) 01:37:50ID:???
>>766,920,922-925
相変わらず何やってるのかわからんw
もうちょっとソースの中に #コメント を入れてみたらどうか。
自分で見て何やってるか分かったとしても、他人はそうではないのだから。

csv なのに
split(/,/); じゃなくて split(/\t/); ってやってるのはいいんだっけ?

あと
> print WRITE_BBSDAT"$val,$aval ←じゃ縦にならんじゃう。横にそれぞれ上下で表示したい。";
わからん。
縦になったのなら 「それぞれ上下」 にはなったんではないのか。

$val,$aval
ってなりたいのか
$val
$aval
ってなりたいのか。

とりあえず入力されたデータに改行が入ってるままファイルに書き出したらアホなことになるから、
foreach my $k (keys %in) {
$in{$k} =~ s/\x0D?\x0A/<br>/g;
}
とか &ReadParse; の後にやってみたら?
0932nobodyさん2005/10/13(木) 01:47:35ID:???
>>922
ふう、やっとやりたいことがわかった
まず処理手順が問題。今の処理手順だと質問一つずるに対して出力処理をしようとしているけれど、
全ての質問を一つの行にまとめたいなら、保存しておいて後で出力しないと。

# 回答の表示
の頭で
my @vals = ();
my @avals = ();
の二変数を作ってforeachの最後で
push @vals, $val;
push @avals, $aval;
で、foreachを閉じてから、cvs出力で、
print WRITE_BBSDAT join(',', $in{name}, @vals);
print WRITE_BBSDAT join(',', '', @avals);
って感じ。
0933nobodyさん2005/10/13(木) 01:56:30ID:???
>>932 よくがんばったえらい
0934nobodyさん2005/10/13(木) 02:05:22ID:???
>>930
コレじゃダメなん?
(?:^|\W)c=0(?:\W|$)
09359092005/10/13(木) 03:20:42ID:???
>>930,934
すみません、色々と勉強してました。
試してみましたが、おかげさまでうまくいきました。

しかしながら私の知識がまだ追いついていないこともございますので、
これから精進していきたいと思います。

本当にご親切に有難うございました。
09367662005/10/13(木) 11:12:08ID:???


レス有難う御座います。勉強足らずで申し訳ないです。

教えていただいたとおりにやってみますた。
でもやっぱりcsvをexcelで開いた時に思う通りになつてなかた。。なんでだろう
もうわからん。。

最終的にはexcelで開いた時

$in{name} ←これはくり返さない。1回だけ表示(下のセルへ)
$val ←これはその問題数分だけ横にくり返し。excelの横セルはひとつずつ違うセルに。(下のセルへ)
$aval  ←同様。(下のセルへ)

次の人
$in{name}
$val 
$aval

てなっててほしいんです。
説明へたでごめんなさい。
09377662005/10/13(木) 11:16:18ID:???
現状ソース

# 回答の表示
my @vals = (1,2,3);
my @avals = (1,2,3);

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

push (@vals, $val);
push (@avals, $aval);
}
09387662005/10/13(木) 11:17:24ID:???
# csvへ書き込み

open(WRITE_BBSDAT , ">> file.csv");
print WRITE_BBSDAT join(',', $in{name}, @vals);
print WRITE_BBSDAT join(',', '', @avals);
close(WRITE_BBSDAT);

すいません。。ここまで教えてもらったのに。。
0939nobodyさん2005/10/13(木) 17:05:23ID:tGcMLHwK
文字列の一部分を置き換える、という処理はどうすればいいでしょうか

入力されたデータによって、5文字目だったり12文字目の2文字分を
こちらで用意している(これも種類がいくつかある)2文字に置き換えたいんです

aaaaabbbbccddddeee → aaaaxxbbbccddddeee
aaabbbbcccdddddeef → aaabbbbcccddyydeef

一応
  ・置き換えたい位置を確認
  ・それより前をまず転記
  ・置き換え文字を転記
  ・置き換えたい位置よりあとを転記
という風にすれば可能だとは思うのですが、もう少しスマートな方法というのはあるのでしょうか?
0940ヽ(´ー`)ノ ◆.ogCuANUcE 2005/10/13(木) 17:12:57ID:???
>>939
substr() は?置換もできる。

my $str = 'foobarbaz';

substr($str, 1, 2) = 'OO';    # $str is 'fOObarbaz'
0941nobodyさん2005/10/13(木) 17:16:09ID:???
>>939
s/// か
substr() をあたりなされ。

aaaaabbbbccddddeee → aaaaxxbbbccddddeee
5文字目から2文字分を置換なら、

my $str = 'aaaaabbbbccddddeee';
substr($str, 4, 2) = 'xx';

お、先に書き込みが。
0942nobodyさん2005/10/13(木) 22:16:24ID:NiH4hrTC
ひさしぶりに掲示板を作ってます。
なんとか徹夜で終えて、明日の朝に間に合わせたいと思ってます。

思ったより疲れていて思い出せないのですが、
Text::CSV_XSの使い方何ですが、

「あいうえお
かきくえこ」

これってcombineを使えば改行をエスケープしてくれて、parseをしたときに自動で
元に戻してくれると思ってたのですが、勘違いですかね?
改行などその他すべての文字は必要に応じて自分でエスケープなどしないといけないのでしょうか?

でもそれだとこのモジュールの意味がないですよね・・・・;
CSVでのメタ文字?をエスケープしてくれた記憶があるのですが。。。。

どうぞよろしくお願いします。自分でも調べてみます。
0943nobodyさん2005/10/13(木) 22:19:27ID:???
>>942
>>1
http://search.cpan.org/~jwied/Text-CSV_XS-0.23/CSV_XS.pm
09449422005/10/13(木) 22:26:57ID:NiH4hrTC
>>943
英語は読めないので
http://www.perldoc.jp/docs/modules/Text-CVS_XS-0.23/Text-CVS_XS-0.23.pod
これは見ました。

ここに書いてないということは自分で<br>に変換するものでしたっけ?
よくよく考えたら別に自分でやっても大して面倒でもないレベルなのでどうでもいいですが。
"これだけかな?大丈夫なのは。
09459422005/10/13(木) 22:50:16ID:NiH4hrTC
返事がこないorz

もういいや

0946nobodyさん2005/10/13(木) 23:08:14ID:???
>>945
どのような高速返信処理をお求めで?
0947nobodyさん2005/10/13(木) 23:23:07ID:???
40分で返らないとだめなんかw
0948nobodyさん2005/10/13(木) 23:34:41ID:???
> 思ったより疲れていて思い出せないのですが、
ここワロタ
0949nobodyさん2005/10/13(木) 23:40:28ID:???
 徹夜するから3時ぐらいまででいいん…zzz
  <⌒/ヽ-、___
/<_/____/
0950nobodyさん2005/10/14(金) 01:39:33ID:???
>>936-938
入れる場所そこじゃなーいorz
配列の初期データはテストデータだろうから置いておくとしても…

foreach (@question) {
...
foreach (@column) {
next if(!$_);
$anum++;
$answer[$anum] = $_;
} # このforeachの中じゃない

push (@vals, $val);
push (@avals, $aval);
} # pushしたらforeach (@question)のブロックは終わり

# csvへ書き込み
...

だ。も一つ問題点。ログ出力するとき改行忘れてた。スマソ
print WRITE_BBSDAT join(',', $in{name}, @vals), "\n";
print WRITE_BBSDAT join(',', '', @avals), "\n";

> $in{name} ←これはくり返さない。1回だけ表示(下のセルへ)
> $val ←これはその問題数分だけ横にくり返し。excelの横セルはひとつずつ違うセルに。(下のセルへ)
> $aval  ←同様。(下のセルへ)
>>922といってることが違う気がするのだが。
名前を別の行にしたいなら、そこだけ出せばよろし

>>931が指摘してる点の修正もお忘れなく
> とりあえず入力されたデータに改行が入ってるままファイルに書き出したらアホなことになるから、
0951nobodyさん2005/10/14(金) 02:57:23ID:???
モジュールがどんな機能なのか一覧になっているとこはどこでしょうか。
日本語で。
0952nobodyさん2005/10/14(金) 06:40:23ID:???
>>951
>>11 >>13
09539392005/10/14(金) 12:01:06ID:???
>>940-941
ありがとうございました
もっとよく調べればよかった・・・orz
09547662005/10/14(金) 14:02:22ID:???
>>950

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


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


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

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

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

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

# 回答の表示

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


09567662005/10/14(金) 14:06:55ID:???
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);
0957nobodyさん2005/10/14(金) 20:23:06ID:???
がんばれ >>950
0958nobodyさん2005/10/15(土) 05:56:59ID:???
>>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 誰か他の人に任...
0959nobodyさん2005/10/15(土) 13:04:17ID:???
乙w
とりあえず誰かが作ったほうが早いことはわかったw
0960nobodyさん2005/10/15(土) 14:18:15ID:???
phpからの移行かなぁ。
アレだと配列もスカラもハッシュも$だからなぁ。(あの仕様はどうかと思う)
0961nobodyさん2005/10/15(土) 14:28:17ID:???
他の言語は $ すらつかないのも多々あるけど、
どうせ $ つけるなら perl に合わせてくれてもいいのにな、とは思った。
0962nobodyさん2005/10/15(土) 15:59:18ID:vVuUdULb
CSV形式のログファイルで掲示板を作ったのですが、
改行をどうしようか悩んでます。

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

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

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

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

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

$txt = "hogehoge\\n\\\\n\n";
$txt =~ s/\\/\\\\/g; $txt =~ s/\r?\n/\\n/g; # escape
$txt =~ s/\\(.)/($1eq'n')?"\n":$1/ge; # unescape
0973nobodyさん2005/10/15(土) 23:27:59ID:???
例えば
<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 />

と、タグ内だけの\を省きたいのですがどのようにすればよいでしょうか?
0974nobodyさん2005/10/15(土) 23:41:42ID:???
>>973
ここでの問答や今やってる事を全て忘れて、
入門書を一冊買って読めばいいんじゃないかな。
もしくはつきっきりで教えてくれる人でも探すとか。
今の状態だと何スレ消費しても先に進まなそうだし。
0975nobodyさん2005/10/15(土) 23:43:09ID:???
Perlコーディングに関係ねーし
0976nobodyさん2005/10/15(土) 23:49:17ID:???
>>974
その反応待ってました。と言う事は難しく考えなければいいのか。
久々にやるから基本忘れてしまった・・・
レス数が950を超えています。1000を超えると書き込みができなくなります。