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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2006/07/27(木) 17:04:23ID:???
Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
0312nobodyさん2006/08/05(土) 13:12:05ID:???
誰かマジレスしてやれよ
0313nobodyさん2006/08/05(土) 13:18:43ID:???
306の発言はアレだが、claimの意味を知らずに煽っている奴は
辞書を引いて見るといい。
0314nobodyさん2006/08/05(土) 17:42:22ID:IQdTNDFf
クレーム【claim】
(1)商取引で契約当事者から出される損害賠償の請求を伴った苦情。
(2)(一般に)苦情。注文。「―をつける」
三省堂提供「デイリー 新語辞典」より
0315nobodyさん2006/08/05(土) 17:56:39ID:???
>>313
どうみてもこういう場合には不適切じゃね?
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:???
UNIX板みたいな流れだな
0318nobodyさん2006/08/06(日) 12:14:13ID:NewLER86
perl5には my と local の違いがありますが、
 どのように使い分けたらいいのか分かりません。
 (同じとしか思えない)
どういうときにmyを使うべきか、
どういうときにlocalを使うべきか、 おしえていただけますでしょうか?
 よろしくお願い申し上げます。
0319nobodyさん2006/08/06(日) 12:26:48ID:???
つperlsub
0320nobodyさん2006/08/06(日) 13:22:44ID:???
>>318
local はパッケージグローバル変数の値を一時的に差し換えて利用するための関数で、ダイナミックスコープと呼ばれる効果範囲を持っています。
my はシンボルテーブルに属さない局所的な変数を宣言するための関数で、レキシカルスコープと呼ばれる範囲で利用可能な変数を新たに生成します。

>>318 の求める物はほとんどの場合 my の働きだと思います (ぼくがなぜそう思うか理解できないなら、まず間違いなくそうです)。
ですから、そうしない理由を明示できない場合は常に my (及び use strict) を使ってください。
03213182006/08/06(日) 13:52:08ID:???
>>319-320
親切にごせつめいいただいてありがとうございます。
おっしゃるとおりに、my (及び use strict) を使って行こうと思います。
0322nobodyさん2006/08/06(日) 14:37:05ID:???
perl5で、XMLファイルの書き出しを行うスクリプトを作成しています。
ただ、perlソースの文字コードはEUCの為、XMLファイルのUTF-8の文字
コードに変換する必要があると思います。
そこで質問なのですが、EUC→UTF-8への文字コード変換について
一番スマートな方法は何でしょうか?
0323nobodyさん2006/08/06(日) 15:20:29ID:???
>>322
Encode::decode()
0324nobodyさん2006/08/06(日) 15:21:19ID:???
Encode.pm
03253232006/08/06(日) 15:21:52ID:???
おっと、このケースでは Encode::from_to() のほうがいいのかな。
0326nobodyさん2006/08/06(日) 16:40:59ID:???
>>322

>perlソースの文字コードはEUCの為
これに固執する理由による。

文面から見るに 「perlはEUCで書かなければならない」 と勘違いしてないか?
普通に UTF-8 でスクリプト書いても通るよ。
0327nobodyさん2006/08/06(日) 18:22:10ID:???
変換先、変換元の文字コードが変わることがなければfrom_toでやったほうがいい
0328nobodyさん2006/08/06(日) 18:25:45ID:???
>>322
PerlのソースをUTF-8にする
03293222006/08/06(日) 22:57:22ID:???
>おっと、このケースでは Encode::from_to() のほうがいいのかな。
有難うございます。おっしゃった方法で解決できました。
UTF-8でスクリプトを書く方法でも出来ました。
皆様有難う御座います。
0330nobodyさん2006/08/07(月) 12:05:18ID:???
えーと、>>81で質問したものですが、それに関係した質問をさせていただきます。
bとcが2つ以上あったときに真を返すようにするにはどのようにすればいいのでしょうか?
「abacacaabaa」だったら真を返す、のような感じです。
0331nobodyさん2006/08/07(月) 12:12:57ID:???
少し「正規表現」でググって勉強してこい・・・
0332nobodyさん2006/08/07(月) 12:15:55ID:???
>>330
言い方があいまいでよくわからない

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:???
>>331
申し訳ないです、もう少し粘ってみます

>>332
N(b) >= 2 && N(c) >= 2
これです。わかりにくくてすみません
03343332006/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:???
b,cの出現順序はbbcc,bcbc,bccb,cbbc,cbcb,ccbbの6通りあるので
それぞれの文字の間に.*はさんで|でならべればできあがり。

わざわざ正規表現使わずに数えたほうが楽かもね。
0336nobodyさん2006/08/07(月) 12:52:26ID:???
つまらないことですが教えてください。
perldebugでインタラクティブなperlを使用するために

$ perl -d -e 42

とありますが、なぜ42なのでしょうか?
0337nobodyさん2006/08/07(月) 13:57:17ID:???
ttp://ja.wikipedia.org/wiki/42
0338nobodyさん2006/08/07(月) 14:04:39ID:???
>>335
0339nobodyさん2006/08/07(月) 14:09:26ID:???
>>336
たぶん 「answer to life the universe and everything」
03403362006/08/07(月) 14:10:30ID:???
>>337
>>339
ありがとうございます。有名なジョーク(というかなんというか)なのですね。
0341nobodyさん2006/08/07(月) 21:15:48ID:???
CGI掲示板を製作したんですが、
フォームにINPUT type=imageを使用した時にnameとvalueが無効になってしまっているようなんです。
これは元々そういう仕様なんでしょうか?
それとも何かが間違っているのでしょうか?
0342nobodyさん2006/08/07(月) 21:21:23ID:???
typeにimage入れてどうすんの。
HTMLの質問はWeb制作板へ。
0343nobodyさん2006/08/07(月) 21:52:54ID:DmsXLNko
誘導されて来ました。よろしくお願いします。

nameに同じ名前を指定する時、
Input typeがcheckboxならばcgi-lib.plで処理出来るのですが
hiddenの時も同じように処理は出来ないのでしょうか?
&ReadParseの力を使っても何も表示されませんでした。
0344nobodyさん2006/08/07(月) 22:21:18ID:????BRZ(1002)
もうね
0345nobodyさん2006/08/07(月) 22:26:32ID:???
>>342
type に image は XHTML1.1のDTDにも定義されてる、有効な属性値だよ。
0346nobodyさん2006/08/07(月) 22:42:46ID:???
imageはたとえばnameをfooにしたら、foo.x=クリックした横座標&foo.y=クリックした縦座標が来るよ?
0347nobodyさん2006/08/07(月) 22:56:05ID:???
>>343
cgi-lib.pl使ってないけど
普通にできると思う。
けどnameをおんなじ名前指定するのは、非推奨のはずなので
perlというより、サーバー側でちゃんと処理されない可能性は考えられる。
詳しい人あとよろしく
0348nobodyさん2006/08/07(月) 23:34:23ID:???
@hoge = SplitParam('name');
で取り出せるよ?
03493432006/08/08(火) 02:46:18ID:???
>>344,347,348
無事出来ました。ありがとうございました。
・・・・もう少し自力で出来るように頑張ります。すみません。
0350nobodyさん2006/08/08(火) 05:27:55ID:???
サブルーチンに&を付けてないからPHPかと一瞬思ってしまった。
0351nobodyさん2006/08/08(火) 07:10:51ID:???
いやそれはおかしい
0352nobodyさん2006/08/08(火) 08:21:39ID:???
またKEMT仕様か
0353nobodyさん2006/08/08(火) 10:21:01ID:???
wwwwwwwww
0354nobodyさん2006/08/08(火) 12:23:07ID:???
最低限サブルーチンには「&」を付けるべきだろ。
えらい見づらくなる
0355nobodyさん2006/08/08(火) 12:28:11ID:???
つ、釣られないクマー!
0356nobodyさん2006/08/08(火) 12:33:02ID:???
質問があるんで聞いて下さい。
テキストファイルを読み込む時に半角スペースで区切って文字を認識させてるっぽいんですが
改行して認識させるにはどうしたらいいっスかね?
0357nobodyさん2006/08/08(火) 12:35:01ID:???
>>356
もちょいkwsk
0358nobodyさん2006/08/08(火) 12:38:35ID:???
>>357
いやファイルを読み込んでforeach ( split(/\s+/, $test) ) {って感じでなってるんだけどこれだと半角スペースで
区切って複数を認識させるんだけどそれを改行して複数認識させたいっていうか・・・。
0359nobodyさん2006/08/08(火) 12:46:39ID:???
普通に
/\s+/
↓
/[\r\n]+/
とかでいいんでね?
まあ、今回は何もいうまい。
0360nobodyさん2006/08/08(火) 13:14:12ID:???
if(バックスペース又はシフトが押される){エラー文}

として、画面を戻すのを弾こうとおもうのですが、ifの条件の式が分かりません
解説しているサイトがあれば教えてください。お願いします
0361nobodyさん2006/08/08(火) 13:21:46ID:???
それ以前にそれ本当にPerlか?
0362nobodyさん2006/08/08(火) 13:25:42ID:???
スレ違いてか板違いw web制作板へどうぞ。
そのままだとユーザビリティに反するので答えてくれないかもしれないが
0363nobodyさん2006/08/08(火) 14:21:20ID:???
>>361
>>362
板違いかorz web制作に行ってみるよ
0364nobodyさん2006/08/08(火) 23:25:32ID:???
perlのCGIでラジオボタンを使った登録フォームを作成しているのですが、
ラジオボタンの制御がうまくいきません。

どういうことかというと、
フォームに必要項目を入力してもらい、確認ボタンを押した後、
入力項目にエラーがあると修正ボタンが表示され、
修正をしてもらうという仕組みなのですが、
修正ボタンを押して入力フォームに戻ると、ラジオボタンが選択していた
状態ではなくなり、デフォルトの状態にもどってしまいます。

修正ボタンを押した後に、ラジオボタンの位置を、選択した箇所のまま表示させるには
どのような処理を行えばいいのでしょうか?

どなたかご教授お願い致します。
修正画面までラジオボタンのデータが渡っていることまでは確認済みです。


0365nobodyさん2006/08/08(火) 23:33:10ID:???
valueが一致するラジオボタンにcheckedを付ける。
0366nobodyさん2006/08/08(火) 23:50:03ID:???
>>365
早速アドバイスありがとうございます。

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:???
>>360
これとかだな。
http://search.cpan.org/~nwclark/perl-5.8.8/lib/Term/ReadLine.pm
0368nobodyさん2006/08/09(水) 00:16:15ID:???
HTML::FillForm
0369nobodyさん2006/08/09(水) 02:28:37ID:2nlyYTa7
Perl初心者です。投票スクリプトを製作しています。
データの書き込み処理に躓きました・・・。ヒントを下さい・・・。

$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:???
一旦、ログファイルを全部読み込んで、s/^(\s*\Q$hoge\E\s+)(\d+)(.*)$/$1.($2+1).$3/me とか。
03713692006/08/09(水) 03:40:54ID:eB/zZqiV
>>370
ありがとうございます。かなり複雑っすね・・・。

たびたび申し訳ありませんが、自分には何のこっちゃか・・・ orz
0372nobodyさん2006/08/09(水) 04:05:06ID:???
ログファイルの設計がおかしい
人間が見やすいようにするんじゃなくて
perl様が見やすいようにする

つか、他人の作った投票スクリプトを読み下せ
0373nobodyさん2006/08/09(水) 04:32:22ID:WfKDVGHV
正規表現で、1〜300の数字にマッチさせるにはどうしたらよいでしょうか?
[0-9]{1,3}では999までヒットしてしまいます。
ループもさせたくないのですが、、
0374nobodyさん2006/08/09(水) 05:06:26ID:???
[12]?\d{1,2}
0375nobodyさん2006/08/09(水) 06:10:08ID:???
>>372 のいう >>369 のログファイルの設計のおかしさ、どこかわからないんだけどw
そう書くのは割りと普通じゃないの?
簡単なログファイルでいいのならたぶん俺もそう書く。
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:???
>>369
>>372が言っているように、ログファイルの書式を見直すべし。
1, 2, 最終行 は不要。もし入れたいならコメントと分かるように工夫を。
余分なスペースも不要。

ログファイル例:

1 10
2 20
3 26
4 30
5 10

> 「番号5」の値の投票結果を「+1」していきたい

いったん全部読みこんで、5の値だけ変えて、全部書き出す。
0377nobodyさん2006/08/09(水) 07:22:05ID:???
いや、どう考えても 1,2、最終行は、ここで解説するために追加したラベルだろw
0378nobodyさん2006/08/09(水) 10:40:29ID:???
上から1,2,3・・・って並んでるなら、indexは必要ないだろ
ログファイル例:

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;

で、どうぞ
03793692006/08/09(水) 12:22:14ID:???
本当にありがとうございます orz
0380nobodyさん2006/08/09(水) 13:19:53ID:???
>>378
試したわけじゃないが、何か可笑しくない?
03813782006/08/09(水) 13:27:12ID:???
>>380
えっと、自分は試して書いてますが・・・
最初chompとjoinは書いてませんでしたが、それだとうまく行かなかったので足しました・・・
なので、その辺がちょっと冗長かも・・・
0382nobodyさん2006/08/09(水) 13:29:07ID:???
普通にぶっ壊れそうだなw
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:???
行番号$iをどこかで使うなら↑かなあ
03873852006/08/09(水) 16:33:48ID:???
>>386
ただ単に、ログの合計値を求めたいだけなので、「$i」は使わないっすね・・・。
そうすると、foreachでしょうか?やり方は分からんですが・・・。
0388nobodyさん2006/08/09(水) 16:49:10ID:???
がんばればきっとできる
0389nobodyさん2006/08/09(水) 17:32:59ID:???
さすがにこれから自分でコーディングしようとしてる人間が
関数すら調べようとしないなんてなぁ。
素直に「夏休みの宿題です」と言えば、まだかわいげがあるのに。
0390nobodyさん2006/08/09(水) 17:34:59ID:???
foreachよりforの方が速いって知ってる?
0391nobodyさん2006/08/09(水) 17:40:58ID:???
どのぐらいの量だとその差を実感できますかね
0392nobodyさん2006/08/09(水) 17:57:13ID:WfKDVGHV
>>374
ありがとうございます
0393nobodyさん2006/08/09(水) 18:01:38ID:WfKDVGHV
>>385
行が多いならメモリ節約のために1行づつ読んだほうがいいですよ。
排他したいならflockをした上で、いったんテンポラリファイルで保存してリネームがいいです。
0394nobodyさん2006/08/09(水) 18:13:32ID:???
>385
foreach(@logs){
 $count += $_;
}

while(<LOG>){
 $count += $_;
}

下のほうが推奨されるやり方。
どちらにせよ10 + "15\n" == 25 という危ない等式を使っているので、
ほかの言語でやるときは注意が必要
0395nobodyさん2006/08/09(水) 19:56:07ID:???
>>391
そうか?
俺も結構ゴリゴリ書くから、こうゆう細かい事は極力気にかけてるぉ

>>394
ん?「10 + "15\n" == 25」って何がマズイんだ?
0396nobodyさん2006/08/09(水) 20:06:22ID:???
ギリギリchompしろよ
0397nobodyさん2006/08/09(水) 20:43:00ID:???
>>390 は迷信です。…言うまでもないんだろうけど、こういう与太が広まるのは迷惑っちゃ迷惑なんで。
0398nobodyさん2006/08/09(水) 21:11:29ID:???
>>397
タイプするのが速いって事じゃないの?
0399nobodyさん2006/08/09(水) 21:27:42ID:lhGjc7IL
ヤフーの株価ページにアクセスして必要な情報をテキストに書き出すCGIを作っています。
銘柄コードを1000から9999までループさせ銘柄名を取得するのですが、
ループの回数が少ない場合正常終了するのですが全件やると半分ぐらいまで書き込みが完了した所で
Premature end of script headers
のエラーになってしまいます。
ファイルへの書き込みがタイムアウト?しているのかと思い1000件毎に、CLOSEしてOPENしなおしても変化ありません。
何回かに分けて処理したほうが良いのでしょうか?
次でソースのせます。
0400nobodyさん2006/08/09(水) 21:33:52ID:lhGjc7IL
open(FILE, ">$name_data");#ファイルオープン(クリア)
close(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:???
恐らく run time で kill されてるだけかと
0403nobodyさん2006/08/09(水) 21:52:32ID:???
サーバのタイムアウトの可能性があるから、
ApacheならTimeout値の見直しとか。

共有サーバなら逝ってよし。
0404nobodyさん2006/08/09(水) 22:50:03ID:???
>>402-403

池沼?

無理に「逝ってよし」なんて言葉を使う前に
>>400のやってることを100回見直してみ。
0405nobodyさん2006/08/09(水) 23:20:10ID:???
>404
株価データの著作権とかの問題を言ってる?
0406nobodyさん2006/08/09(水) 23:38:58ID:???
良く分からんけど、
 $dt=get($url);
ってヤフーのデータを読みに行ってるんだよね。
これがforループの中にある事に不吉な気配を感じる。

$iの値は1000から9999まで1ずつ増えるんだよね?
04074032006/08/10(木) 00:12:35ID:???
>>404
さっぱり分からん。

それは本当に、私達に対して言う言葉なのか?
04084002006/08/10(木) 00:30:08ID:???
>>402-403
タイムアウト値を300から2000に変更したところ全て正常終了できました。
ありがとうございます。

>>401、>>404
プログラミングのお作法についてなのか
著作権の問題かどちらかでしょうか?
ネット上に公開されているデータを収集しファイルに落とすことが問題?
会員用のデータを公開したり勝手に売ったりしたら問題だとは思いますが・・
0409nobodyさん2006/08/10(木) 00:58:21ID:???
>404
>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 つかねぇかなー
■ このスレッドは過去ログ倉庫に格納されています