Perlコーディング初心者質問スレ Part 51
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/07/27(木) 17:04:23ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0312nobodyさん
2006/08/05(土) 13:12:05ID:???0313nobodyさん
2006/08/05(土) 13:18:43ID:???辞書を引いて見るといい。
0314nobodyさん
2006/08/05(土) 17:42:22ID:IQdTNDFf(1)商取引で契約当事者から出される損害賠償の請求を伴った苦情。
(2)(一般に)苦情。注文。「―をつける」
三省堂提供「デイリー 新語辞典」より
0315nobodyさん
2006/08/05(土) 17:56:39ID:???どうみてもこういう場合には不適切じゃね?
http://www2.alc.co.jp/ejr/index.php?word_in=claim&word_in3=PVawEWi72JXCKoa0Je
0316nobodyさん
2006/08/05(土) 18:02:07ID:???0317nobodyさん
2006/08/05(土) 18:08:19ID:???0318nobodyさん
2006/08/06(日) 12:14:13ID:NewLER86どのように使い分けたらいいのか分かりません。
(同じとしか思えない)
どういうときにmyを使うべきか、
どういうときにlocalを使うべきか、 おしえていただけますでしょうか?
よろしくお願い申し上げます。
0319nobodyさん
2006/08/06(日) 12:26:48ID:???0320nobodyさん
2006/08/06(日) 13:22:44ID:???local はパッケージグローバル変数の値を一時的に差し換えて利用するための関数で、ダイナミックスコープと呼ばれる効果範囲を持っています。
my はシンボルテーブルに属さない局所的な変数を宣言するための関数で、レキシカルスコープと呼ばれる範囲で利用可能な変数を新たに生成します。
>>318 の求める物はほとんどの場合 my の働きだと思います (ぼくがなぜそう思うか理解できないなら、まず間違いなくそうです)。
ですから、そうしない理由を明示できない場合は常に my (及び use strict) を使ってください。
0321318
2006/08/06(日) 13:52:08ID:???親切にごせつめいいただいてありがとうございます。
おっしゃるとおりに、my (及び use strict) を使って行こうと思います。
0322nobodyさん
2006/08/06(日) 14:37:05ID:???ただ、perlソースの文字コードはEUCの為、XMLファイルのUTF-8の文字
コードに変換する必要があると思います。
そこで質問なのですが、EUC→UTF-8への文字コード変換について
一番スマートな方法は何でしょうか?
0324nobodyさん
2006/08/06(日) 15:21:19ID:???0325323
2006/08/06(日) 15:21:52ID:???0326nobodyさん
2006/08/06(日) 16:40:59ID:???>perlソースの文字コードはEUCの為
これに固執する理由による。
文面から見るに 「perlはEUCで書かなければならない」 と勘違いしてないか?
普通に UTF-8 でスクリプト書いても通るよ。
0327nobodyさん
2006/08/06(日) 18:22:10ID:???0329322
2006/08/06(日) 22:57:22ID:???有難うございます。おっしゃった方法で解決できました。
UTF-8でスクリプトを書く方法でも出来ました。
皆様有難う御座います。
0330nobodyさん
2006/08/07(月) 12:05:18ID:???bとcが2つ以上あったときに真を返すようにするにはどのようにすればいいのでしょうか?
「abacacaabaa」だったら真を返す、のような感じです。
0331nobodyさん
2006/08/07(月) 12:12:57ID:???0332nobodyさん
2006/08/07(月) 12:15:55ID:???言い方があいまいでよくわからない
bとcの個数をそれぞれN(b),N(c)としよう。
N(b) >= 2 && N(c) >= 2
N(b) >= 2 || N(c) >= 2
N(b)+N(c) >= 2
どれともとれるが。
0333nobodyさん
2006/08/07(月) 12:18:33ID:???申し訳ないです、もう少し粘ってみます
>>332
N(b) >= 2 && N(c) >= 2
これです。わかりにくくてすみません
0334333
2006/08/07(月) 12:27:32ID:???>>330のように11文字だったら
if($x =~ /b.{0,10}?g/i and $x =~ /d.{0,10}?d/i) {
何らかの処理
}
でいけました
0335nobodyさん
2006/08/07(月) 12:28:37ID:???それぞれの文字の間に.*はさんで|でならべればできあがり。
わざわざ正規表現使わずに数えたほうが楽かもね。
0336nobodyさん
2006/08/07(月) 12:52:26ID:???perldebugでインタラクティブなperlを使用するために
$ perl -d -e 42
とありますが、なぜ42なのでしょうか?
0337nobodyさん
2006/08/07(月) 13:57:17ID:???0341nobodyさん
2006/08/07(月) 21:15:48ID:???フォームにINPUT type=imageを使用した時にnameとvalueが無効になってしまっているようなんです。
これは元々そういう仕様なんでしょうか?
それとも何かが間違っているのでしょうか?
0342nobodyさん
2006/08/07(月) 21:21:23ID:???HTMLの質問はWeb制作板へ。
0343nobodyさん
2006/08/07(月) 21:52:54ID:DmsXLNkonameに同じ名前を指定する時、
Input typeがcheckboxならばcgi-lib.plで処理出来るのですが
hiddenの時も同じように処理は出来ないのでしょうか?
&ReadParseの力を使っても何も表示されませんでした。
0346nobodyさん
2006/08/07(月) 22:42:46ID:???0347nobodyさん
2006/08/07(月) 22:56:05ID:???cgi-lib.pl使ってないけど
普通にできると思う。
けどnameをおんなじ名前指定するのは、非推奨のはずなので
perlというより、サーバー側でちゃんと処理されない可能性は考えられる。
詳しい人あとよろしく
0348nobodyさん
2006/08/07(月) 23:34:23ID:???で取り出せるよ?
0349343
2006/08/08(火) 02:46:18ID:???無事出来ました。ありがとうございました。
・・・・もう少し自力で出来るように頑張ります。すみません。
0350nobodyさん
2006/08/08(火) 05:27:55ID:???0351nobodyさん
2006/08/08(火) 07:10:51ID:???0352nobodyさん
2006/08/08(火) 08:21:39ID:???0353nobodyさん
2006/08/08(火) 10:21:01ID:???0354nobodyさん
2006/08/08(火) 12:23:07ID:???えらい見づらくなる
0355nobodyさん
2006/08/08(火) 12:28:11ID:???0356nobodyさん
2006/08/08(火) 12:33:02ID:???テキストファイルを読み込む時に半角スペースで区切って文字を認識させてるっぽいんですが
改行して認識させるにはどうしたらいいっスかね?
0358nobodyさん
2006/08/08(火) 12:38:35ID:???いやファイルを読み込んでforeach ( split(/\s+/, $test) ) {って感じでなってるんだけどこれだと半角スペースで
区切って複数を認識させるんだけどそれを改行して複数認識させたいっていうか・・・。
0359nobodyさん
2006/08/08(火) 12:46:39ID:???/\s+/
↓
/[\r\n]+/
とかでいいんでね?
まあ、今回は何もいうまい。
0360nobodyさん
2006/08/08(火) 13:14:12ID:???として、画面を戻すのを弾こうとおもうのですが、ifの条件の式が分かりません
解説しているサイトがあれば教えてください。お願いします
0361nobodyさん
2006/08/08(火) 13:21:46ID:???0362nobodyさん
2006/08/08(火) 13:25:42ID:???そのままだとユーザビリティに反するので答えてくれないかもしれないが
0364nobodyさん
2006/08/08(火) 23:25:32ID:???ラジオボタンの制御がうまくいきません。
どういうことかというと、
フォームに必要項目を入力してもらい、確認ボタンを押した後、
入力項目にエラーがあると修正ボタンが表示され、
修正をしてもらうという仕組みなのですが、
修正ボタンを押して入力フォームに戻ると、ラジオボタンが選択していた
状態ではなくなり、デフォルトの状態にもどってしまいます。
修正ボタンを押した後に、ラジオボタンの位置を、選択した箇所のまま表示させるには
どのような処理を行えばいいのでしょうか?
どなたかご教授お願い致します。
修正画面までラジオボタンのデータが渡っていることまでは確認済みです。
0365nobodyさん
2006/08/08(火) 23:33:10ID:???0366nobodyさん
2006/08/08(火) 23:50:03ID:???早速アドバイスありがとうございます。
HTMLのソースが下のような感じです。
input name="genre" type="radio" value="1-1">
input name="genre" type="radio" value="1-2">
input name="genre" type="radio" value="1-3">
この行一行一行を「m//」でvalueが一致するか調べて
一致したら、「s///」で行ごと置換すればいいのでしょうか?
0367nobodyさん
2006/08/09(水) 00:02:59ID:???これとかだな。
http://search.cpan.org/~nwclark/perl-5.8.8/lib/Term/ReadLine.pm
0368nobodyさん
2006/08/09(水) 00:16:15ID:???0369nobodyさん
2006/08/09(水) 02:28:37ID:2nlyYTa7データの書き込み処理に躓きました・・・。ヒントを下さい・・・。
$hogeに、「5」という数字が入っているとします。
そしたら、下記の「log.dat」の「番号5」の値の投票結果を「+1」していきたいのです。
つまり、「$hogeに入った数字と、log.datの『番号』の値を比べて、同じなら『投票結果』の値を『+1』する」
というスクリプトを組みたいのですが・・・・。
ログファイル(log.dat)の中身は以下の通りです。
番号 投票結果
-----------------------
1 10
2 20
3 26
4 30
5 10
-----------------------
どうか、よろしくお願いします。
0370nobodyさん
2006/08/09(水) 03:32:28ID:???0371369
2006/08/09(水) 03:40:54ID:eB/zZqiVありがとうございます。かなり複雑っすね・・・。
たびたび申し訳ありませんが、自分には何のこっちゃか・・・ orz
0372nobodyさん
2006/08/09(水) 04:05:06ID:???人間が見やすいようにするんじゃなくて
perl様が見やすいようにする
つか、他人の作った投票スクリプトを読み下せ
0373nobodyさん
2006/08/09(水) 04:32:22ID:WfKDVGHV[0-9]{1,3}では999までヒットしてしまいます。
ループもさせたくないのですが、、
0374nobodyさん
2006/08/09(水) 05:06:26ID:???0375nobodyさん
2006/08/09(水) 06:10:08ID:???そう書くのは割りと普通じゃないの?
簡単なログファイルでいいのならたぶん俺もそう書く。
open (略); read(略); %data = split(/\s+/);
だけでもデータとれるし。
>>369
+1 して保存するときは普通に。
$data{5}++;
foreach (sort { $a <=> $b } keys %data) { print 略 $_, "\t", $data{$_}, "\n"; }
close (略);
>>370 は結構トリッキーな書き方だね。 (.*)$ の部分はどうして必要なのかちょっとわからなかったけど。
0376nobodyさん
2006/08/09(水) 07:14:26ID:???>>372が言っているように、ログファイルの書式を見直すべし。
1, 2, 最終行 は不要。もし入れたいならコメントと分かるように工夫を。
余分なスペースも不要。
ログファイル例:
1 10
2 20
3 26
4 30
5 10
> 「番号5」の値の投票結果を「+1」していきたい
いったん全部読みこんで、5の値だけ変えて、全部書き出す。
0377nobodyさん
2006/08/09(水) 07:22:05ID:???0378nobodyさん
2006/08/09(水) 10:40:29ID:???ログファイル例:
10
20
26
30
10
で、十分。あとは、
open fh,$log;
@dat=<fh>;
close fh;
chomp @dat;
$dat[$hoge - 1]++;
open fh,">$log";
print fh join "\n",@dat;
close fh;
で、どうぞ
0379369
2006/08/09(水) 12:22:14ID:???0381378
2006/08/09(水) 13:27:12ID:???えっと、自分は試して書いてますが・・・
最初chompとjoinは書いてませんでしたが、それだとうまく行かなかったので足しました・・・
なので、その辺がちょっと冗長かも・・・
0382nobodyさん
2006/08/09(水) 13:29:07ID:???0383nobodyさん
2006/08/09(水) 13:31:01ID:???0384nobodyさん
2006/08/09(水) 14:05:56ID:???0385nobodyさん
2006/08/09(水) 16:08:49ID:???-------------------------
10
20
26
30
10
-------------------------
のようなログがあった場合、この数字を全て足していきたいのですが、
-------------------------
open(LOG," $log");
@logs=<LOG>;
close(LOG);
for ($i = 0; $i <= $#logs; $i++) {
$count += $logs[$i];
}
-------------------------
で、大丈夫でしょうか?
ひょっとすると、forよりforeachやwhileを使ったしたほうがよろしいのでしょうか?
アドバイスよろしくお願いします orz
0386nobodyさん
2006/08/09(水) 16:28:35ID:???0387385
2006/08/09(水) 16:33:48ID:???ただ単に、ログの合計値を求めたいだけなので、「$i」は使わないっすね・・・。
そうすると、foreachでしょうか?やり方は分からんですが・・・。
0388nobodyさん
2006/08/09(水) 16:49:10ID:???0389nobodyさん
2006/08/09(水) 17:32:59ID:???関数すら調べようとしないなんてなぁ。
素直に「夏休みの宿題です」と言えば、まだかわいげがあるのに。
0390nobodyさん
2006/08/09(水) 17:34:59ID:???0391nobodyさん
2006/08/09(水) 17:40:58ID:???0392nobodyさん
2006/08/09(水) 17:57:13ID:WfKDVGHVありがとうございます
0393nobodyさん
2006/08/09(水) 18:01:38ID:WfKDVGHV行が多いならメモリ節約のために1行づつ読んだほうがいいですよ。
排他したいならflockをした上で、いったんテンポラリファイルで保存してリネームがいいです。
0394nobodyさん
2006/08/09(水) 18:13:32ID:???foreach(@logs){
$count += $_;
}
while(<LOG>){
$count += $_;
}
下のほうが推奨されるやり方。
どちらにせよ10 + "15\n" == 25 という危ない等式を使っているので、
ほかの言語でやるときは注意が必要
0395nobodyさん
2006/08/09(水) 19:56:07ID:???そうか?
俺も結構ゴリゴリ書くから、こうゆう細かい事は極力気にかけてるぉ
>>394
ん?「10 + "15\n" == 25」って何がマズイんだ?
0396nobodyさん
2006/08/09(水) 20:06:22ID:???0399nobodyさん
2006/08/09(水) 21:27:42ID:lhGjc7IL銘柄コードを1000から9999までループさせ銘柄名を取得するのですが、
ループの回数が少ない場合正常終了するのですが全件やると半分ぐらいまで書き込みが完了した所で
Premature end of script headers
のエラーになってしまいます。
ファイルへの書き込みがタイムアウト?しているのかと思い1000件毎に、CLOSEしてOPENしなおしても変化ありません。
何回かに分けて処理したほうが良いのでしょうか?
次でソースのせます。
0400nobodyさん
2006/08/09(水) 21:33:52ID:lhGjc7ILclose(FILE);
open(FILE, ">>$name_data");#追加書き込みでファイルオープン
eval{ flock(FILE, 2) };
for($i = $start_code ; $i < $end_code ; ) {
$cd = sprintf("%04d",$i);
$url="ヤフーのURL";
$dt=get($url);
@data = split(/\n/,$dt);
$j = 0;
while($j < @data) {
if(銘柄名の行になったら){
$sk = $data[$j];
$sk =~ s/\<b\>//g;#ごみ取り
$sk =~ s/\<\/b\>.+//g;#ごみ取り
$sk = jcode::sjis($sk);
$sk =~ s/\(株\)//g;#ごみ取り
print FILE jcode::sjis("$cd\,$sk\n");#書き込み
$j = 100000#終わりなので抜ける
}
++$j;
}
++$i;
if(substr($cd,1,3) eq "000"){
close(FILE);
open(FILE, ">>$name_data");#タイムアウト防止で1000毎に書き込み
eval{ flock(FILE, 2) };
}
}
close(FILE);
こんなです。よろしくおねがいします
0401nobodyさん
2006/08/09(水) 21:43:24ID:???0402nobodyさん
2006/08/09(水) 21:43:42ID:???0403nobodyさん
2006/08/09(水) 21:52:32ID:???ApacheならTimeout値の見直しとか。
共有サーバなら逝ってよし。
0405nobodyさん
2006/08/09(水) 23:20:10ID:???株価データの著作権とかの問題を言ってる?
0406nobodyさん
2006/08/09(水) 23:38:58ID:???$dt=get($url);
ってヤフーのデータを読みに行ってるんだよね。
これがforループの中にある事に不吉な気配を感じる。
$iの値は1000から9999まで1ずつ増えるんだよね?
0408400
2006/08/10(木) 00:30:08ID:???タイムアウト値を300から2000に変更したところ全て正常終了できました。
ありがとうございます。
>>401、>>404
プログラミングのお作法についてなのか
著作権の問題かどちらかでしょうか?
ネット上に公開されているデータを収集しファイルに落とすことが問題?
会員用のデータを公開したり勝手に売ったりしたら問題だとは思いますが・・
0409nobodyさん
2006/08/10(木) 00:58:21ID:???>402-403のことで解決したってた。
解決策も提案できないチンカスは早く寝ろや
>404
サーバーに負担かけすぎなので、出来れば一定間隔でsleep入れて相手のサーバーを思いやるか、
特定銘柄のみの取得にするといいかも。
0410nobodyさん
2006/08/10(木) 00:58:52ID:???2個目は400さんへだ。
0411nobodyさん
2006/08/10(木) 02:31:33ID:???>著作権の問題かどちらかでしょうか?
どちらでもありません。ただ死んでください。
0412nobodyさん
2006/08/10(木) 02:57:32ID:???このへんの板も ID つかねぇかなー
■ このスレッドは過去ログ倉庫に格納されています