Perlコーディング初心者質問スレ Part 43
レス数が900を超えています。1000を超えると表示できなくなるよ。
0001nobodyさん
2005/08/12(金) 01:26:47ID:mHnZWvqz【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0843842
2005/10/11(火) 10:45:14ID:???「=」の左辺に右辺の結果が代入されるんだぞ。
ちょっと勉強しなおして来い。一発で見抜けなかった俺も修行してくるから。
0844nobodyさん
2005/10/11(火) 10:49:14ID:4r4FVZwbじぇんじぇん頭が回ってなかったなw
よ〜し、では修正に逝ってきますw
0845nobodyさん
2005/10/11(火) 10:53:23ID:4r4FVZwb$kexp= 200;
$pexp= 676;
$bexp= 267;
$a= $kexp;
$b= $pexp;
$c= $bexp;
$d= $a + $b + $c;
print $d;
んで、一応上記のとおりに直しました。
その後はどうすればいいんですかね??
まじ、初歩的ですまんorz
0846nobodyさん
2005/10/11(火) 11:03:44ID:iD4ymnU6Image::Magickで画像の出力を試しているのですが、
Firefoxで以下のエラーメッセージが表示され上手くできません。
"画像ファイル "http://test.notw.biz/sample.cgi" は壊れいているため、表示できませんでした。"
シェルから実行したところ上手く画像は出来ているのですが、
ブラウザから動かすとうまく行きません。
http://www.gac.jp/article/index.php?stats=question&category=12&id=15812&command=msg
も参考にしましたが駄目でした。
use Image::Magick;
my $img_bg = new Image::Magick;
$img_bg->Set(size=>"90x9");
$img_bg->ReadImage("xc:pink");
print ("Content-type: image/png \n\n");
binmode STDOUT;
$img_bg->Write("png:-");
print "\n";
解決方法は何かないでしょうか?
>> $img_bg->Write("png:-");
を強制的にフラッシュ出来れば何とかなりそうな気はするのですが。。。
0847nobodyさん
2005/10/11(火) 11:24:44ID:???0848nobodyさん
2005/10/11(火) 11:26:44ID:???>原因が分からないのですが何かの切っ掛けでこの部分がたまにエラーを吐いてきます。
>
>129 : foreach(keys %an){
>130 : $data = sprintf("%08d\t$_",$an{$_});
>131 : push(@count,$data);
>132 : }
"%08d\t$_"は、$_の内容に応じて、展開結果が変わる。
展開結果の中に書式指定文字列としてタブーなものが混じることもあるから、
「たまにエラーを吐く」ということになるのだろう。
$data = sprintf("%08d\t%s", $an{$_}, $_);
のようにすると解決すると思われ。
0849nobodyさん
2005/10/11(火) 11:59:20ID:???0851nobodyさん
2005/10/11(火) 12:26:14ID:4r4FVZwbヘッダーの足し方がいまいち不明で、
どこら辺に足せばいいのかがわからなくて、
ただいま格闘しておりました・・・。
ですが、ヘッダーがどんな物かはわかるんだけど、
やはり場所が不明で500になってしまいます。
0852nobodyさん
2005/10/11(火) 12:30:16ID:8zYGlOye質問があります。
foreach(sort @data){
としたいのですが@dataの中身はカンマ区切りで2番目と3番目のキー
でソートしたいのですが方法はありますでしょうか?
0854nobodyさん
2005/10/11(火) 12:34:55ID:???わかってないことをわかったように言うな。
#!/usr/bin/perl
print "content-type:text/plain\n\n";
$kexp= 200;
$pexp= 676;
$bexp= 267;
$a= $kexp;
$b= $pexp;
$c= $bexp;
$d= $a + $b + $c;
print $d;
これで動かなきゃあとは一行目だ。
0855nobodyさん
2005/10/11(火) 13:18:47ID:???0856nobodyさん
2005/10/11(火) 13:28:06ID:???0857846
2005/10/11(火) 15:16:03ID:???print を抜いても
IE、Operaで試してみても駄目でした。
色々調べているのですが
どうにも手に負えそうにないので別な方法を考えようと思います。
ありがとうございました。
0859nobodyさん
2005/10/11(火) 15:40:53ID:XkXcz5GJ$1と書かなければならないところで\1と書くとうまく動作しませんが、
\1をすべて$1と書きかえて問題が生じることはありますか?
0861796
2005/10/11(火) 19:28:50ID:???私のやりたかったことは、
if($form{read/([0-9a-zA-Z]+)/]}){ print $1; }
このような判定がかけられればと質問させていただいた次第です。
説明不足ですみませんでした。
順次試させていただきます。
有難うございました。
0863nobodyさん
2005/10/11(火) 21:18:28ID:???お前がそう書いたらどういう風に動くことを期待しているのか
説明してくれないと結局何がなんだかわからないわけだが。
0864820
2005/10/11(火) 21:49:41ID:???一応できたの載せときます。
#!/perl
#ex2.plx
use warnings;
use strict;
print "Hexadecimal and Octal number converter\n\n Please enter the Hexadecimal number:";
my $hex = <STDIN>;
chomp($hex);
print hex $hex,;
print "\n Please enter the Octal number:";
my $oct = <STDIN>;
print oct $oct,;
一番まいったのが$と#の違いに気づくのに1時間近くかかったことでしょうか・・・
いや〜Perlって奥が深い
0866820
2005/10/11(火) 21:55:29ID:m+2zbTP9Decimalを256以下の数字で聞いてきて、それをBinaryにコンバートするプログラムをつくっれ
っていうものなんですが・・・ヒントがあって、(bitwise operator 8回使用)
っていう問題なんです。
これって、IF使わないとだめなんでしょうか?それともIF使わないでもできるっぽいです?
まだIF習ってないのでもしかしてこれは誤問題じゃないか!?
って疑惑があがって来てるんですけど。。
できるんですか?教えて神様
0868796
2005/10/11(火) 21:58:13ID:???すみません。
existsってありますよね。
これの正規表現版のようなことをしたかった次第でございます。
そして可能であれば存在するキーの一部を後方参照できれば、と
先ほどの書き込みをさせていただきました。
0870nobodyさん
2005/10/11(火) 22:15:43ID:???0873796
2005/10/11(火) 22:41:01ID:???おっしゃるとおりです。
可能であれば、+後方参照もということでした。
>>870
帰宅後やってみたいと思います。
色々とご返答有難うございました。
0874nobodyさん
2005/10/11(火) 23:03:18ID:C7OEkxia$hoge2 = "運転";
if($hoge =~ /$hoge2/){
print "ok";
}
マッチしないんですけど、なぜでしょうか。。
0876nobodyさん
2005/10/11(火) 23:08:27ID:???激しくありがとう!
0877nobodyさん
2005/10/11(火) 23:25:44ID:???http://homepage1.nifty.com/nomenclator/perl/shiftjis.htm#errors
の、「マッチするはずなのにマッチしない (1)」
0879nobodyさん
2005/10/11(火) 23:33:36ID:???今後のためにもいいんじゃないのか
0880nobodyさん
2005/10/11(火) 23:39:41ID:???今後は結局本人次第かと。
0881820
2005/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:???0885nobodyさん
2005/10/12(水) 00:41:00ID:???0891871
2005/10/12(水) 02:14:08ID:???ちょwwwおまwwwwwビット演算子使えって言われてるのに
どうしてそういう答えになるんだよw ビットシフト使うんだよw
おまい授業ちゃんと聞いてないだろ。ちょと必死に基礎から勉強しなおせ
0892nobodyさん
2005/10/12(水) 02:36:00ID:???変わってる気がするのは俺だけか。
まあ hex や oct も習ってるしその延長かなあ。
perl なんだから、もっと目的があって作ってて楽しいことから教えればいいのに、って思っちゃう。
0894nobodyさん
2005/10/12(水) 05:26:24ID:???つか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番目にくる場合もあるんですね。
こういう場合、配列から取り出したい文字列を抜き出すのはどうやったら
いいのでしょうか?
ご教授お願いいたします。
0898nobodyさん
2005/10/12(水) 13:32:50ID:???取り出す必要はないよなw
0900nobodyさん
2005/10/12(水) 16:08:46ID:???>宿題は昔から自分でやれという決まりですよね。。。
本来はそうなのだが、今回は特別だ。
教官が感激してくれるようなものを作ってやったぞ。
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:???print "input number: ";
my $input = <STDIN>;
printf ("\n【照合用】 %08b", $input);
これだけでもいいかと思うんですが…
>>820の教官の問題にも問題があると思ってるのは漏れだけですか?
0902nobodyさん
2005/10/12(水) 18:37:38ID:???>>900 の回答は、>>866 の宿題に対するものだけど、
「ビット演算子を8回使う」という条件があるみたいだから、
printfの出力はあくまでも参考のみ。
0903901
2005/10/12(水) 18:55:56ID:???>>900先生のコードはすばらしいと思うのですが…
なんでこんな問題を…と少し思ったしだいです。
>>820がどんな教科書で勉強してるのかも興味ありです。
0904nobodyさん
2005/10/12(水) 19:14:52ID:???入れられてしまうので、その後に入れた順番でソートをかける
ことは不可能という認識で間違いございませんでしょうか。
0905nobodyさん
2005/10/12(水) 19:50:30ID:???ハッシュを eash/keys/values/配列コンテキスト等で読み出した
際の順序は、人間にとっては一見ランダムだが、perl 自身に
とってはランダムではないし、何回呼んでも必ず同じ順序になる。
入れた順序に関係なく、目的の値を分かり易い名前で素早く取り
出せるように作られているのが今の perl の実装なので、入れた
順序が重要なら、それに適したデータ構造 -- 配列を利用するか、
Tie::IxHash のようなラッパーを使う。
0906820
2005/10/12(水) 22:09:26ID:???すごいプログラムありがとうございます。
ですが宿題はすでに提出してしまいました。。
なので今後の参考にさせていただきます
>>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:???0909nobodyさん
2005/10/13(木) 00:17:06ID:???ご教示いただけますと幸いです。
0912909
2005/10/13(木) 00:33:27ID:???やりたいことは、QUERY_STRINGの判定に
(\W|)c=3
このようなイメージの指定をしたいのですが、ようは英数字以外が
cの前にきた場合と「?c=3」と前に何もない場合を指定したいという
ことです。
説明下手ですみません。
0916nobodyさん
2005/10/13(木) 00:42:22ID:???sleepだと5%ぐらい使ってしまってるみたいで・・・
0918909
2005/10/13(木) 00:46:02ID:???ご教示有難うございます。
ぐぐって調べてみましたが、どうやらこれは
(?<!...) ゼロ幅の否定後読み表明
みたいですね。
私には少し敷居が高そうなので、もう少し勉強してみます。
とにかく有難うございます。
0919909
2005/10/13(木) 00:52:49ID:???すみません、行き違いになりました。
なるほど、と試してみましたが、なぜか引っかからなくなって
しまいました。
調べてみます。
0921909
2005/10/13(木) 01:00:44ID:???× (^|\W)c=1
× (^)c=1
○ ^c=1
なんででしょうね。。
もう少し調べてみます。
0922766
2005/10/13(木) 01:07:08ID:???>>777
遅ればせながらレス有難うございます。
しかしながらいまだcsvへの書き込みが上手くいきません。。
やりたいのは、csv開いたときに
名前,Q1の回答,Q2の回答,Q3の回答。。。。
空欄,Q1の正解,Q2の正解,Q3の正解。。。。
と横並びにカンマ区切りで出したいのですがいろんなソースを入れてみても
上手くいきません。。泣
しかも名前を普通にFORM POSTからとりたいんだけど、どこにソース入れてもエラーになる。。
0923766
2005/10/13(木) 01:08:08ID:???【question_1cgi】
# 質問の取得
&ReadParse;
if(open(IFILE,"question_1.tsv")) {
while(<IFILE>) {
chomp();
push(@question,$_);
}
close(IFILE);
}
0924766
2005/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] = $_;
}
0925766
2005/10/13(木) 01:09:56ID:???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:???ありゃ、もしかしてPerlのバージョンが古いと動かなかったりするのかな
バージョンいくつか分かる?とりあえず5.6.1と5.8.7では動作したけど・・・
Perl4探してこよう・・・
0929909
2005/10/13(木) 01:18:14ID:???おっしゃるとおりの条件にマッチさせたいと思っております。
そしてご回答有難うございます。
ちょっと私にはもう少し理解する時間が必要になりそうですが、
一つ一つ勉強していきたいと思います。有難うございます。
>>927
v5.8.4ですので、バージョンは問題ないかと思います。
検証してみます。お手数おかけしましてすみません。
0930nobodyさん
2005/10/13(木) 01:28:27ID:???$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:???相変わらず何やってるのかわからん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:???ふう、やっとやりたいことがわかった
まず処理手順が問題。今の処理手順だと質問一つずるに対して出力処理をしようとしているけれど、
全ての質問を一つの行にまとめたいなら、保存しておいて後で出力しないと。
# 回答の表示
の頭で
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);
って感じ。
0935909
2005/10/13(木) 03:20:42ID:???すみません、色々と勉強してました。
試してみましたが、おかげさまでうまくいきました。
しかしながら私の知識がまだ追いついていないこともございますので、
これから精進していきたいと思います。
本当にご親切に有難うございました。
0936766
2005/10/13(木) 11:12:08ID:???レス有難う御座います。勉強足らずで申し訳ないです。
教えていただいたとおりにやってみますた。
でもやっぱりcsvをexcelで開いた時に思う通りになつてなかた。。なんでだろう
もうわからん。。
最終的にはexcelで開いた時
$in{name} ←これはくり返さない。1回だけ表示(下のセルへ)
$val ←これはその問題数分だけ横にくり返し。excelの横セルはひとつずつ違うセルに。(下のセルへ)
$aval ←同様。(下のセルへ)
次の人
$in{name}
$val
$aval
てなっててほしいんです。
説明へたでごめんなさい。
0937766
2005/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);
}
0938766
2005/10/13(木) 11:17:24ID:???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:???substr() は?置換もできる。
my $str = 'foobarbaz';
substr($str, 1, 2) = 'OO'; # $str is 'fOObarbaz'
0941nobodyさん
2005/10/13(木) 17:16:09ID:???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でのメタ文字?をエスケープしてくれた記憶があるのですが。。。。
どうぞよろしくお願いします。自分でも調べてみます。
レス数が900を超えています。1000を超えると表示できなくなるよ。