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

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

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

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

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

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

過去ログやお勧めサイトは >>2-10
0102nobodyさん2006/07/31(月) 11:17:46ID:???
>>98
何を言ってるのか分からない。
(変数名).htmlというファイルを作りたいのか、
変数名を反映させた内容のhtmlファイルを作りたいのか、
>記事の投稿があったその都度に、その内容で新規HTMLを生成するスクリプトを考えてます
コレなんかは単に掲示板の出力をファイルにすればイイだけでは・・?
0103nobodyさん2006/07/31(月) 11:20:43ID:???
>>94
趣味の範囲の話しだけど
$hogeにはいる値の候補が文字列なら$hoge ne""とした方が読みやすいと思う。
0104nobodyさん2006/07/31(月) 11:29:14ID:???
$hoge ne '' と !$hoge では$hogeが"0"のとき挙動違うし。
0105nobodyさん2006/07/31(月) 11:35:59ID:???
http://www.rfs.jp/sb/perl/05/goto.html

なんかラベルなんていらねって書いてあるけど、CGIでは結構使いところあるけどなぁ。
初めから設計通りに作るとかじゃなく、その場その場でどんどん機能が追加されていく場合に
数行処理をふっ飛ばしたいとか、多分多くの人がifとか$error = 1とかでやるところも
gotoでもっと簡単にできるのにって思った。

詳しい人にすっごい突っ込まれそう。
怖いがちょっと突っ込まれてみたいかも
0106nobodyさん2006/07/31(月) 11:37:47ID:???
>>104
というか、数値が入ったり文字列が入ったりするような変数があるコードは設計がおかしい。
そして、数値が入ってるか文字列が入ってるか分からないような状態でif文にかけるようなコードは
明らかに設計がおかしい。

http://pc8.2ch.net/test/read.cgi/tech/1153312202/
0107nobodyさん2006/07/31(月) 11:39:46ID:???
Perlだしなあ
0108nobodyさん2006/07/31(月) 11:40:34ID:???
>>106
'0'という文字1文字の文字列もあるだろ。
0109nobodyさん2006/07/31(月) 11:42:32ID:???
>>105
>数行処理をふっ飛ばしたいとか、多分多くの人がifとか$error = 1とかでやるところも
たぶんそういうところは関数定義で何とかする
0110nobodyさん2006/07/31(月) 11:55:33ID:???
if(0ne''){print 2}
if('0'ne''){print 3}
if(0){print 5}
if('0'){print 7}
>>23
01111052006/07/31(月) 11:58:13ID:???
>>109
そこらへんがスリコミなんですかね。
目的も知らずに、「テーブルレイアウトはダメだ」と言うのに近い。

実際自分もgoto使うの気が引ける。
でもね。それで目的が果たせるのになぜ気が引けるのか。
で、スリコミだなぁって。

いやいや、スリコミじゃないだろって否定してもらいたいってのもあるんですけど。
0112nobodyさん2006/07/31(月) 12:24:48ID:???
すいません、今掲示板に確認画面を加える改造をしているのですが、
少々疑問があったため、質問させていただきます。

「投稿フォーム → 確認画面」 に行くとき、改行等を

$value =~ s/\r\n/<br>/g;
$value =~ s/\r/<br>/g;
$value =~ s/\n/<br>/g;

で、デコードするんですが、

もし「投稿フォーム → 確認画面 → 投稿フォーム」 にと、戻ったとき改行は

$hoge =~ s/<br>/\n/ig;

で、処理してよろしいのでしょうか?ちょっと自信がありません・・・。
0113nobodyさん2006/07/31(月) 12:25:40ID:???
>>110
キンパルの蛙の大合唱に見えて仕方ない
0114nobodyさん2006/07/31(月) 12:30:33ID:???
>>112
エスケープちゃんとしてるか?
タグを埋め込まれてアボーンしても知らないよ?

んでな。普通はHTML表示部分のところだけ<br>と置換するが、
その置換結果を別の変数に入れるんだよ。大本をなくしたら困る時も出てくるからね。

<修正点があるので修正をする>とかのボタンで前のページに飛ばす時は
input type="hidden"1"に置換してない方の文字列を埋め込むのよ。
でもその時もエスケープは必要だから。

とりあえず動作確認してみなさい。
できないならローカル環境整えなさ稲。
0115nobodyさん2006/07/31(月) 12:32:00ID:???
input type=hiddenに埋め込む時はURIエスケープね。
確認画面で相手が書き込んだ内容を相手に見せる時はHTMLエスケープね。
ダレラ
0116nobodyさん2006/07/31(月) 12:32:31ID:???
gotoは判ってる奴が必要なときに使うのはいいんだが、判ってない奴がめちゃくちゃに
使うと手に負えないから表では使用禁止といっとくぐらいがちょうどいい。
0117nobodyさん2006/07/31(月) 12:35:40ID:???
例外処理にはErrorなんてモジュールがあるけどこれはどうなんだろ
0118nobodyさん2006/07/31(月) 13:09:04ID:oRCGT1rh
use CGI;
use Time::Local;

&timelocal(・・・


先日まで問題なく動いてたんですが、本日使用しているPGM全てで
落ちるようになりました。

とりあえず回避するコードを書いたんですが、原因って何がかんがえられますか?

0119nobodyさん2006/07/31(月) 13:30:54ID:???
>>118
パーミッションは?
とりあえずエラーログだせよ。
わかるわけねえだろボケ。

>>117
何がじゃ
0120nobodyさん2006/07/31(月) 13:32:35ID:???
>>118
原因ねえ。おまいの頭が悪いってあたりが一番怪しいんじゃないか?
とりあえずそこらへんから検討してみてはいかが?
0121nobodyさん2006/07/31(月) 13:36:06ID:???
>>118カワイソスw
プログラム変えてないのに挙動が変わったのなら鯖側でしょ
0122nobodyさん2006/07/31(月) 13:41:15ID:???
エラーメッセージも晒さずに聞いてわかるわけねーじゃん。
0123nobodyさん2006/07/31(月) 13:46:29ID:???
そういやビッグロブ、鯖変更メンテした時にフルパスが変わってたな。アナウンス無しに。
画像掲示板の画像が出なくなって驚いた記憶がある。
0124nobodyさん2006/07/31(月) 15:22:42ID:???
>>123
残酷にも程がアル
0125nobodyさん2006/07/31(月) 15:50:18ID:???
>>123
絶対パスは$ENV{DOCUMENT_ROOT}から取得したらいいよ。
後、バッククォート演算子でpwdしたり、Cwdモジュールで取得したりするのもいいかも
0126nobodyさん2006/07/31(月) 16:00:06ID:???
>>115
うそやん(´・ω・`)
hidden で %ef%80%80 とか書くと普通に % が %25 になるお。
0127982006/07/31(月) 16:45:36ID:YjkkI8MZ
>>102
レスありがとうございます。
スマソです。
(変数名).htmlのファイルを生成したいのです。
ひな形としての.htmlファイルは予め用意されていてるけど、
内容の一部も変数を反映させるけどこれはなんとかなりそうなんです。

最初はrenameを使うのかと思ったんですけど、これだとダメですね。
0128nobodyさん2006/07/31(月) 17:12:27ID:???
Webporgとは違うんですが、Perlでソケット通信についての質問はどこでしたらいいんでしょうか?
通信技術はハードよりの話題みたいなので・・・
0129nobodyさん2006/07/31(月) 17:19:09ID:???
別にここでもいいんじゃね
ム板でもいいけど
0130nobodyさん2006/07/31(月) 17:35:49ID:???
>>129
ありがとうございます。
ム板のほうがよさそうですね。
過去ログ読んで整理してきます。
01311152006/07/31(月) 17:53:53ID:???
>>126
ごめんお(´・ω・`)
0132nobodyさん2006/07/31(月) 21:03:01ID:???
配列に格納したファイル名から拡張子を除いた部分を表示させたいと思っています。
書きの例だと「abc」を取得したいと思っています。

perl -e "@file=('abc.txt');print split (/\./, $file[0])[0];"
perl -e "@file=('abc.txt');print (split (/\./, $file[0]))[0];"

以上の2例でもsyntax erorが出ます。
splitは配列を返すので、その配列の[0]を参照するという書き方でいいと思うのですが、
どのようにしたら正常に表示できるのでしょうか。

perl -e "@file=('abc.txt');print scalar (split (/\./, $file[0]));"

このように記述すると2が表示されるので、splitの結果は配列になって帰ってきているとは思うのですが。
0133nobodyさん2006/07/31(月) 21:08:03ID:????BRZ(1002)
+ 付けろ
0134nobodyさん2006/07/31(月) 21:22:36ID:???
print ((split(/¥./, $file[0]))[0]);
0135nobodyさん2006/07/31(月) 23:02:34ID:???
print 文での () はシンタクスエラーの元
>>134 氏みたく丁寧に () を書いて、 print に正しく情報を与えるか、
perl -e '@file=("abc.txt");print [ split /¥./, $file[0] ]->[0] . "¥n";'
の様にリファレンスで出力するか。
0136 ◆TWARamEjuA 2006/07/31(月) 23:16:36ID:????BRZ(1019)
>>135
133のことも忘れないでね♪
01371352006/07/31(月) 23:32:48ID:???
すまん、>>133 正直は何の事だか理解できなかった…が、やってみて判った!
もしかして基本?(汗
0138nobodyさん2006/07/31(月) 23:34:13ID:???
s/正直は/は正直/
わたひの受けた衝撃の高さを物語っています。orz..
0139982006/07/31(月) 23:34:40ID:YjkkI8MZ
?BRZ(1019)
なにこれ?
きっと板違いだね
0140nobodyさん2006/07/31(月) 23:36:06ID:???
+てどこに付けるの?
まじで分からん。
0141nobodyさん2006/07/31(月) 23:37:42ID:???
たぶん。
perl -e '@file=("abc.txt");print + ( split /¥./, $file[0] )[0] , "¥n" ;'
0142nobodyさん2006/07/31(月) 23:47:51ID:???

sub html_escape{
my @value = @_;
for (my$i=0;$i<@value;$i++){
$value[$i] =~ s/&/&/g;
$value[$i] =~ s/</</g;
$value[$i] =~ s/>/>/g;
$value[$i] =~ s/"/"/g;
$value[$i] =~ s/'/?/g;
}
return @value==1 ? $value[0]:@value;
}
my $test = "a <br> b <br> c <br>";
my @test = (qw/a <br> b <br> c <br>/);
my %test = (qw/a <br> b <br> c <br>/);
my $test_html = &html_escape($test);
my @test_html = &html_escape(@test);
my %test_html = map{$_,&html_escape($test{$_})}keys %test;
#@test_html{sort keys %test} = &html_escape(sort values %test);
print $test_html,"<br><br>",@test_html,"<br><br>",%test_html;

簡単に作ろうと思いました。これで動作しますが、実はマグレでどこか穴などありますか?
できれば
my %test_html = &html_escape(%test);
が理想だったのですが。
0143982006/07/31(月) 23:51:40ID:YjkkI8MZ
で、すみません。
もぅ一度質問して良いですか?

つまりsn uploaderとかそれ系のperlアプリでありがちな処理として
投稿された動画データの変数$1234などを元に閲覧用の外部htmlファイルを生成出来るように
したいんです。

ソースを眺めてもいまいち理解しずらいので勉強がてら一から組んでみようと思ってるんです。
どなたかヒント頂けませんか?

makehtmlという関数らしき記述があるけど。
自作の関数を組み込んでるんでしょうね。

かなり敷居の高いテクニックなんでしょうか。。
0144nobodyさん2006/07/31(月) 23:54:52ID:???
>>141
thx やっと分かった
01451422006/07/31(月) 23:55:45ID:???
もういいです!^^v
0146982006/08/01(火) 00:12:44ID:t9If8ozv
結城さんのmakeweb.plを使って呼び出す形で使えば良いですかね?
誰か教えて!
0147nobodyさん2006/08/01(火) 00:36:58ID:???
>>137
3行目以降を+の話に入れ替えるくらい基本。
>>143
確かSn Uploaderは静的htmlを出してる。それがmakehtmlだったかな。
負荷対策だろうけど、動的にファイルインデックス作るのとコードは似たようなもん。
で、説明下手だからどんな状況からどんなhtml作りたいのか書いて。1レスに収まるように。
01481352006/08/01(火) 00:54:07ID:???
そうですね。perldoc -f print にもしっかり乗っている話だし、
どう考えても [LIST]->[] の方が邪道でした。
0149nobodyさん2006/08/01(火) 00:58:53ID:???
>>142
の
s/&/&/
などは、配布スクリプトで汚染チェックとか書いてあるのですが、何か意味はあるのでしょうか?
0150nobodyさん2006/08/01(火) 01:04:28ID:???
「汚染チェック」 ・・・^^;;;;
0151982006/08/01(火) 01:17:50ID:t9If8ozv
>>147
ありがとうございます!
元のスクリプトはKentWebさんのclip_bordなんです。
それに拡張子のwmvを追加し投稿されたwmvデータを$xxx.wmv.htmlで出力出来るようにしました。
(ここまでは簡単)
実は当面必要と思われるだけの1.wmv.html 2.wmv.html...と作ってディレクトリに突っ込んでやろうかとも思いましたが。。
あまりにバカっぽいのでやめました(笑
ひな形となるwmvプレーヤを組み込んだhtmlファイルをperlスクリプト内に置くか外部に置くかはまだ
決めてませんが、その雛形html内に$xxxを渡しつつその変数でのhtml作成を考えています。
# 添付データを書き込み
#.wmvに.htmlを追加。
if ($tail eq ".wmv") {$tail .= ".html" ;
#.wmv.htmlファイルの自動生成この辺り。
}
$imgfile = "$ImgDir$no$tail";
if (!open(OUT,"> $imgfile")) {
if ($clip_err) { &error("画像のアップロードに失敗しました"); }
}
binmode(OUT);
binmode(STDOUT);
print OUT $upfile;
close(OUT);
chmod(0666,$imgfile);

#の部分に雛形htmlファイルと生成の為のスクリプトを組み込めないものかと考えています。

思いっきり見当違いかも知れませんしこれじゃ伝わらないかもですが。。
勉強しようと思います。
よろしくお願いします。

0152982006/08/01(火) 01:29:44ID:t9If8ozv
更に恥じを忍んで晒すと。

http://irom.sytes.net/clip_img/n2/253.zip
これが現状でのスクリプトです。
0153nobodyさん2006/08/01(火) 01:38:38ID:???
>>151
要するにアップロードされたファイル1個1個に対して間接DL/再生ページを吐き出したいわけね。
$xxxにファイルの番号が入ってるのかな?
そのhtmlの雛型あるじゃん。その中でファイルごとに変動させたい部分を探すの。そこを変数にしといて
$htmlcontents =<<<"EOH"; # この構文はヒアドキュメント
<html>略
<title>$xxxの再生ページ</title>略
<... src="$xxx.wmv">略
EOH
とでもhtml化してあとはこの$htmlcontentsを"$xxx.wmv.html"といったファイル名で出力すればいいよ。
$tail .= ".html";するのはファイル出力直前のが良さそう。
0154982006/08/01(火) 01:48:22ID:t9If8ozv
>>153
その通りの事なんです。
それは理解出来そうです。ありがとうございます。
で、その>$xxx.wmv.html"といったファイル名で出力すればいいよ。
との事だけど、その出力関数?つまりUnixで言う所のmk...コマンドのような、
どういう記述でファイルを新規出力させれば良いのだろうかと。

perlのファイル周り関数を見てもそれに当たるものが見当たらないようだし。
どうでしょ?

$tail...の部分も含めてアドバイス、本当にありがとうございます。
0155nobodyさん2006/08/01(火) 02:00:28ID:???
>>154
普通にファイルオープンしてhtmlを書き込むんだよ。
検索すれば山ほど出るから調べてね。使うアクセスモードは">"になるよ。
0156982006/08/01(火) 02:06:04ID:t9If8ozv
あぁそっかー
ファイルオープンで良いんだ。。
超基本ですね。きっと。

それでググって更に納得です!
ありがとう。

俺も数年後ぐらいには、ここで初心者(超)の質問に答えてあげられるぐらいになりたいですよ。
がんばろ。
感謝。
0157nobodyさん2006/08/01(火) 02:28:05ID:k536PVpv
アップしたファイル(ページ)を10日後など一定時間後に自動消去させるにはどうすればよいでしょうか?
0158nobodyさん2006/08/01(火) 02:31:26ID:???
そういう事がしたいなら、静的ファイルを作るんじゃなくて、動的にページを表示するようにした方がいいね。
0159nobodyさん2006/08/01(火) 04:18:36ID:???
>>158
動的とは?
0160nobodyさん2006/08/01(火) 05:38:10ID:???
別に鯖側で管理しなくても、
PerlでFTPコマンド送信すればおk
0161nobodyさん2006/08/01(火) 06:40:14ID:rFB6zqEC
ものすごく初心者質問ですみません。
入力エリアが未記入かどうかの判断は

if ($変数名 ne "")

以外にもあるのでしょうか?

$htmlbuf .= "$cdname<input type=\"hidden\" name=\"$code\" value=\":$cdno=\">
<input name=\"$code\" size=\"15\" value=\"$input\"> <BR>\n";
↑このような記述で
コード名称 入力エリア <br>

というのをいくつか繰り返して表示させてます。
初期表示では入力エリア($input)はスペース("")を送っています。
これで入力エリアに何か入れてsubmit後の処理なのですが
$codeには
「:$cdnoの値1=$inputの値1:$cdnoの値2=$inputの値2……etc」と入っているので
「:」ごとに配列に格納し、要素を「=」で$cdnoと$inputにわけ
if ($input ne ""){処理} という風にしたいのですが、未記入にも関わらず{処理}になります。
直前にPRINT文を入れて値を確認しても、未入力エリアには何も入っていません(多分長さ0)
何か表示されないコードのようなものが入ってるのかな?と思うのですが
それを確かめる術もわかりません。
単純な質問のわりに長文になって申し訳ありません。
よろしくお願いします。






0162nobodyさん2006/08/01(火) 08:08:11ID:???
>>161
見間違い。printされてたか、変数名が違うか、実は別の処理が呼ばれてたか。
unpackするかlength使っとけば長さ0かどうかは分かる
print unpack("H*",$input); print length $input;
あとスペース(0x20)と空文字列は区別してね。
01631612006/08/01(火) 09:10:57ID:???
>162
早々のレスありがとうございました。
print unpack("H*",$input); print length $input; を入れてみたところ
$inputには"2020"長さは2。最後の項目のみ"20"長さ1となりました。
空文字ではないということはわかりました。

printされていたか?というところなのですが
初期表示で$htmlbuf をprintして入力エリアを表示しているので
この時点で「””(空文字)」は「2020」になるのでしょうか?
入力のある項目は「20入力文字20」となるので、勝手に半角スペースが挿入されてるみたいです。
最後の入力エリアのみ「20」の長さ1になるのも謎ですが
半角スペースを空文字に置き換える処理を入れておかないといけないということでしょうか?
0164nobodyさん2006/08/01(火) 10:18:06ID:???
NullはNull。
HTMLソースをよくみてみろ
ぬるぽ
01651612006/08/01(火) 11:13:02ID:???
「""」=空文字=Nullではないということですか?
このあたりは私の説明もごっちゃになってたと思います。

初期表示で「""」をセットした項目ならば、未入力の場合同様に「""」で判断できるかと思ったのですが
それはできないということでしょうか?
0166nobodyさん2006/08/01(火) 11:25:57ID:???
半角スペースが挿入されてるってことはNullじゃないってことでしょ
0167nobodyさん2006/08/01(火) 14:44:10ID:???
すまないが
誰か use について詳しく説明してるサイト
教えてくれ

俺のミニマム脳みそじゃ見つからん
0168nobodyさん2006/08/01(火) 14:53:09ID:???
つperldoc
0169nobodyさん2006/08/01(火) 15:05:14ID:???
>>161
submit後の処理というのは、クライアント側からsubmitしてきた場合
の処理の意味ですか?それだったらどういう風にフォームデコードして
目的の文字列(「:$cdnoの値1=$inputの値1:$cdnoの値2=$inputの値2……etc)を得ているのか
詳しく説明よろしく。基本的にいって未入力の場合の$val ne ""は普通に使えますよ。
0170nobodyさん2006/08/01(火) 15:07:36ID:???
>>167
useの何に引っかかってるのか書いてくれないと、なんとも・・・
0171nobodyさん2006/08/01(火) 15:21:02ID:???
>>170
ブログスクリプトの共通ファイルを
下位ディレクトリに入れて共用しようとしたけど
どうやら use 何がしで読み込んでるらしく
どうしたら良いのか見当がつかなかったのです

調べてみたら
plファイルで指定してるけど
配布されてるものらしく指定箇所が
やたら多いので諦めました(´・ω・`)
しかもこのpl使って固有のログとってるから
共有するわけにもいかず・・・

お騒がせしました
0172nobodyさん2006/08/01(火) 15:23:59ID:???
webから直接アクセスされるスクリプトが少数なら、それらの先頭
(#!/usr/bin/perl の次の行あたり)に

use lib './下位ディレクトリ';

追加してみて。
0173nobodyさん2006/08/01(火) 15:27:26ID:???
改造工房池
0174nobodyさん2006/08/01(火) 15:28:33ID:???
>>172
うごいたーヽ(゚∀゚)ノ

ありがとう
しばらくテストして実装してみる
0175nobodyさん2006/08/01(火) 20:48:20ID:???
初心者です。すんません。
掲示板を作成しているのですが、

[1] [2] [3]

みたく、ログ数をリンクさせたいのですが、自分の小さい頭ではどうしてもその方法が分かりません・・・。
本当に小さいことで構わないので、ヒントをよろしくお願いします・・・。
0176nobodyさん2006/08/01(火) 20:52:48ID:???
>>175
KENTのを参考にすれば?
01771612006/08/01(火) 21:42:14ID:???
>169
すみません。最初の質問でInputのnameを変数名で指定していましたが
正しくは直接その名前を書いてます。「$code」→「code」

知識が無いので説明が的を得てなかったらごめんなさい。

$htmlbuf .= "$cdname<input type=\"hidden\" name=\"code\" ……… <BR>\n";
↑$htmlbufをHTMLファイルで指定したエリア(userarea)に入れてプリント。
初期画面だと入力エリアには未入力で表示されています。
codeには :コード1=空文字:コード2=空文字:… という形になっています

入力エリアに何か入れてsubmitボタンを押す
(これがクライアント側の処理という認識でよいのでしょうか?)

デコードはcodeをサブルーチンに渡して
{
local($value, $codeto, $flag) = @_;
$codeto ? ($kcd = $codeto) : ($kcd = $basic'kcd);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
unless($flag){
$value =~ s/</</g;
$value =~ s/>/>/g;
$value =~ s/"/"/g;
}
&jcode'convert(*value, $kcd);
$value;
}

コードはsjisで変換です。
内容については既存のものなのでどのような変換内容なのかは理解していません。
すみません。
0178nobodyさん2006/08/01(火) 23:43:21ID:???
そう言われても分かるわけねえ('A`)
0179nobodyさん2006/08/02(水) 00:22:16ID:???
>>177
デコードはそれであってるのでいじらないほうがいいでしょう。

>codeには :コード1=空文字:コード2=空文字:… という形になっています
という形になってますというけど普通はこんな形にならないわけで、
この形を作ってる部分のコードが分からないとどうしようもないです
01801572006/08/02(水) 00:45:20ID:???
>>160
それで指定可能なんですか?
0181nobodyさん2006/08/02(水) 01:30:13ID:???
>>180
sn uploaderとかでやってるのは、確か、ファイル作った
日時を別ファイルに保存しておいて、起動ごとにそのファイル参照しながら
チェックとかしてたような・・・
unlinkとかファイル演算子とか調べると参考になると思う
0182nobodyさん2006/08/02(水) 01:34:36ID:lNNds71o
PHPのmd5()関数のように、簡単なハッシュ関数を作れる関数ってPerlにはありませんか?
0183nobodyさん2006/08/02(水) 01:54:59ID:???
>>182
crypt。用途知らないけどモジュールでMD5使う方が適してるかも。
01841612006/08/02(水) 02:44:01ID:???
>179
すみません。もう少し手前からかくべきでしたね。
foreach(@aaa){
 if データがあれば{
$input = データ;
}
else{
$input = "";
}
$htmlbuf .= "$cdname<input type=\"hidden\" name=\"code\" value=\":$cdno=\">
<input name=\"code\" size=\"15\" value=\"$input\"> <BR>\n";
}

実際には@aaaから条件で抽出したデータのみ処理をするのですがここでは略してます
繰り返す事によってcodeの中に「:$cdnoの値=$inputの値」のセットが後ろに追加されていきます
初期表示の場合は入力がないので$inputに全て「""」を直前にセットします(これは確認しました)
なので初期状態及び、入力のない項目は「:$cdnoの値=空文字」になるかと思います。
しかしデコード後のcodeの内容を変数に入れてプリントさせてみると
$inputの値のところ(=の右)は半角スペースになっているのです。
ほかの部分は特に何か文字が入ったりはしません。
0185nobodyさん2006/08/02(水) 02:44:37ID:???
>>183
ありです。
md5はモジュールぶっこまないとだめなんすねー
0186nobodyさん2006/08/02(水) 03:55:04ID:???
正規表現が正しい記述か間違った記述か判定するにはどうすればよいでしょうか?
0187nobodyさん2006/08/02(水) 04:17:52ID:???
>>186
つ【http://www.oreilly.co.jp/books/4873111307/】
0188nobodyさん2006/08/02(水) 04:31:15ID:???
>>186
正規表現が正しい(意図したとおり)かどうか機械的に判定する方法なんてあるわけ無い。
と、突き返したいところだが…

--- 以下、エスパー的解釈 ---
外部から入力されたorプログラム外に用意した正規表現を実行しようと、
$regexにその正規表現の文字列を入れて、/$regex/ と言う風にしてみました。
しかし、入力された正規表現に構文エラーがあったときに、例えば
Unmatched ( in regex; marked by <-- HERE in m/( <-- HERE / at -e line 1.
のようなエラーとなり停止してしまいます。そこで、事前に正規表現にエラーが無いかを
判定すればよいかと思ったのですが、その方法がわかりません。どうすればよいでしょうか?
--- 以上 ---
こういう質問だと仮定しての回答。マッチングするときにevalブロックを使えばよい。
構文エラーがあったときはそのevalブロックを抜けて、$@にエラーメッセージがセットされる。
eval { ... /$regex/ ... }
if ($@) { エラー時の処理 }

# そういう質問じゃないと言うのなら、順序だててちゃんと説明汁。質問はこういう風に丁寧に。
0189nobodyさん2006/08/02(水) 08:17:41ID:????BRZ(1002)
>>185
Digest::MD5は標準モジュールだにょ
0190nobodyさん2006/08/02(水) 09:45:04ID:???
>>188
消えろ
0191nobodyさん2006/08/02(水) 10:26:58ID:???
なんか最近沸きすぎじゃね?w
0192nobodyさん2006/08/02(水) 10:38:04ID:???
課題でやるやつもいるからしょがないわな
0193nobodyさん2006/08/02(水) 10:44:09ID:???
//././..././/././///./.././././//../././///.//./././././././././././

モールス信号です。解読してください。そして回答をモールス信号で下さい。
0194nobodyさん2006/08/02(水) 10:51:20ID:???
いやです。
0195nobodyさん2006/08/02(水) 10:52:07ID:???
課題でPerl!?世の中変わったな・・・
0196nobodyさん2006/08/02(水) 11:52:13ID:???
>>195
いいからシネよ。
0197nobodyさん2006/08/02(水) 12:55:52ID:???
夏だなぁ・・・
0198nobodyさん2006/08/02(水) 13:56:29ID:???
>>184
たとえば今

use CGI;
$a = new CGI;
print $a->param('code');

print <<FORM;
<form action="$ENV{SCRIPT_NAME}" method="post">
<input name="code" value=":1="><br>
<input name="code" value="a"><br>
<input name="code" value=":2="><br>
<input name="code" value="b"><br>
<input name="code" value=":3="><br>
<input name="code" value=""><br>
<input name="code" value=":4="><br>
<input name="code" value=""><br>
<input type="submit">
</form>
FORM
;

というコードを走らせてみましたが、
普通に:1=a:2=b:3=:4=
という出力が返ってきました。
ということで、CGI.pmを使うことをお勧めします。

あと、htmllintなどでもかかれてますが、同じname値をもったinputを複数
設置して値をつなぐというのは非標準です。ので、その動作は基本的には
保証されてません。
0199632006/08/02(水) 16:47:03ID:???
>>99月またぎの遅い返事。書かれちゃってるのかあ。そうかあ。情報ありがとう。またひとつかしこくなったきがする。
0200nobodyさん2006/08/02(水) 18:11:03ID:Sa4fTnpW
掲示板に海外?からの迷惑書き込みが多く、対応策を考えています。
分からないなりに色々と調べて以下のような対応をしてみました。
迷惑書き込みのほとんどが英語の書き込みなので、書き込み内容が
全て半角文字だったら書き込みしないようにしたつもりです。

if($comment =~ /[\x81-\x9f\xe0-\xef][\x40-\x7e\x80-\xfc]/){
$textchk = 0;
}
else{
$textchk = 1;
}

if ( $textchk = 1 ){
print "書込み内容が不適切です\n";
}

この対応でだいぶ書き込みが減ったのですが、まだ一部「Good design!
」みたいな書き込みがされていました。これも全て半角文字なのですが、
なぜ書き込みされてしまうのでしょうか?自分のPCから「Good design!
」と書き込もうとしたときはちゃんとチェックがかかります。文字コード
(シフトJISやEUC)の違いなのでしょうか?

ちなみに
if ( index ($comment, 'Good design!') >= 0 ){
$textchk = 1;
}
という文も入れてみたのですが、ダメでした。

よろしくお願いします。
0201nobodyさん2006/08/02(水) 18:25:23ID:???
>>200
正規表現を変えた方が良いかも。
if ($comment =~ /[^ -~]/) { # 英語以外の文字がある
 $textchk = 0;
} else {
 $textchk = 1;
}

↑これだと文字コード依存無いし、元のより速いはず。
■ このスレッドは過去ログ倉庫に格納されています