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

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

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

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

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

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

過去ログやお勧めサイトは >>2-10
0283nobodyさん2006/08/03(木) 18:22:35ID:???
あー俺もそれ悩んでJsで引数としてHTMLのリファラー渡して解決したわ
0284nobodyさん2006/08/03(木) 19:17:34ID:Uu9V7GTd
1.自分はこういう事がしたい。
CGI_Liteを用いて作成したアップローダーで、実際にアップロードする前に
1回確認画面(「このファイルでOK?」という感じのもの)を入れたいと考えています。

2.それでこんな風にやってみたが・・・
<INPUT TYPE="file" NAME="up_data">の内容を
$data = $FORM{'up_data'};として、確認画面で
<INPUT TYPE="hidden" NAME="up_data" VALUE="$data">
と入れて保持しておこうとしてみました。

3.こんなエラーが出て上手く行かなかった。
エラーというかhiddenのVALUEが空っぽになってしまいました。

そもそも自分がやろうとしていることが可能かどうかも分からない状況です。
具体的な手順を教えていただければこれ以上のことはありませんが、
可能か不可能かという回答だけでも構いませんので、よろしくお願いします。
0285nobodyさん2006/08/03(木) 19:21:13ID:???
アップされたファイルはテンポラリファイルに一時保存しておく
0286nobodyさん2006/08/03(木) 19:24:01ID:???
アップロードに確認画面いらんと思うけど
02872842006/08/03(木) 19:26:19ID:Uu9V7GTd
>>285
あぁ!なるほど!
とりあえずは確認画面に行くと同時にアップしておいて
確認画面でキャンセルしたらテンポラリファイル削除
確認画面でそのままOKしたらテンポラリファイルリネーム
って感じですかね。
ありがとうございます!
目からウロコでした。
0288nobodyさん2006/08/03(木) 19:29:53ID:???
>>287
確認画面でキャンセルも何もしなかったら、という場合も考えなよ。
ファイル残るから
02892842006/08/03(木) 19:37:26ID:Uu9V7GTd
>>288
完全に見落としてました。
危うくゴミだらけになるとこでした。
その解決方法は・・・
テンポラリファイルの名前にアップした日時を入れておいて
次回CGIにアクセスがあった場合にそのときの日時と比較して
ある程度の差があるファイルは全て削除
というようなものを想像してみましたが、変ですかね・・・?
0290nobodyさん2006/08/03(木) 19:47:22ID:???
俺もそうすると思う
02912842006/08/03(木) 19:52:27ID:Uu9V7GTd
>>290
やろうとしていることが間違ってないという後押しは心強いです。
ありがとうございました!
0292nobodyさん2006/08/03(木) 20:35:00ID:???
>ID:Aqv2fKnb
ロングテールでググれ。話はそれからだ
0293nobodyさん2006/08/03(木) 22:03:34ID:???
>>282-283
輪足の場合はjsが現実的そうですね。
ちょっとあきらめかけてましたが、盲点でした。
jsをバカにしすぎてまいた。

すれではおれいあしな。
0294nobodyさん2006/08/03(木) 22:15:14ID:???
SSI 使ってもできるね
0295nobodyさん2006/08/03(木) 22:36:00ID:???
それでは結局全ページcgiと変わらない罠。
まぁアクセス解析img挿入もかわらんか。

apacheログとるのが一番楽。
0296nobodyさん2006/08/03(木) 22:53:08ID:???
ここはPerlでどうやるかのスレ・・・

って、apacheのログを取るモジュールをPerlで作ればスレ違いじゃない!
0297nobodyさん2006/08/03(木) 23:44:20ID:???
CGIの呼び出し元を限定したいんですがこれはHTTP_REFERERを見て判断するしかないでしょうか?
自分自身からの呼び出しのみを許可して外部からの呼び出しは禁止させたいんですが
HTTP_REFERERだと容易に偽れてしまいますよね?
0298nobodyさん2006/08/03(木) 23:52:51ID:???
>>281
hoge.cgiを呼び出す側のhtmlもcgiにして、
<img src="hoge.cgi?$ENV{HTTP_REFERER}">
でもできそう。
というか全部のページをCGI にするのって、perlならそれほどめんどくさくない。
0299nobodyさん2006/08/04(金) 00:09:46ID:???
>>298
・・・(´・ω・`)
0300nobodyさん2006/08/04(金) 10:16:58ID:???
>>298
・・・(´・ω・`)ガンバレ
0301nobodyさん2006/08/04(金) 11:38:58ID:???
回答者っぽい釣りなのかなあれは・・・

>でもできそう。
ほのぼのマンか?
0302nobodyさん2006/08/04(金) 15:31:36ID:???
>>298
よ〜く考えよ〜
0303nobodyさん2006/08/04(金) 15:54:14ID:???
呼び出す側もcgiにするならそもそもimg要素でやる必要がどこにwww
0304nobodyさん2006/08/04(金) 16:50:18ID:???
・・・(´・ω・`)あんまいじめちゃだめだぞ
0305nobodyさん2006/08/04(金) 19:29:09ID:???
>>298の人気の半分でも俺にあれば・・・orz
03062982006/08/04(金) 22:20:26ID:???
hoge.cgi(画像出力)からindexのリファラを知りたいっていうクレームでしょ。
0307nobodyさん2006/08/04(金) 22:36:36ID:???
>>306
・・・(´・ω・`)クレーム・・・
0308nobodyさん2006/08/04(金) 22:47:41ID:???
>>306
・・・(´・ω・`)ガンガレ
0309nobodyさん2006/08/04(金) 22:56:52ID:???
>>306
壁|ω・`)
0310nobodyさん2006/08/05(土) 11:02:00ID:???
>>306
(ノ∀`)
0311nobodyさん2006/08/05(土) 13:08:16ID:???
>>298,306ヨシヨシヾ(・ω・`)
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
■ このスレッドは過去ログ倉庫に格納されています