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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん05/01/27 18:08:42ID:???
Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
0140nobodyさん05/02/05 02:44:20ID:???
>>139
あのコードから何を出力したいかわかるとは・・・
お前、エスパーだな?
0141nobodyさん05/02/05 02:45:38ID:???
137じゃないけど何を出力したいかはわかるでしょ。
014213705/02/05 02:51:46ID:???
三次元になったらどうやって出力しようか迷っていたところだ。
0143nobodyさん05/02/05 03:17:56ID:???
すみません。ものすごい初心者なんですが
Perlの起動が上手くいきません…
XPでPerlのVerは5.8.3です

とりあえずデフォルトでインストールは終わったのですが
コマンドプロンプトを開くと即閉じてしまいます。
サイトみてもXPの説明が…
0144nobodyさん05/02/05 03:28:41ID:???
>>143
スレ違いです。

△▲ WebProg 初心者の質問 Part11 ▼▽
http://pc5.2ch.net/test/read.cgi/php/1101635909/
0145nobodyさん05/02/05 03:30:56ID:???
すみません〜。そちらで聞いてみます
014613705/02/05 03:40:32ID:???
>>134
どうすればいいんだこのコード
014713705/02/05 04:28:25ID:???
>>134
9時までに返事しないとコード内の改行とタブ、不要なスペースを全部消す。
0148nobodyさん05/02/05 05:41:11ID:???
>>134
とりあえず2個目の foreach の @value を @$value に変えて正常に出力されるのを確認したら、
http://www.google.co.jp/search?hl=ja&q=Perl+%E9%85%8D%E5%88%97%E3%81%AE%E9%85%8D%E5%88%97
で勉強してくれ。

>>147 なんつーか…
print'<table>',(map{('<tr>',map("<td>$_</td>",@$_),'</tr>')}@tbl),'</table>';
0149nobodyさん05/02/05 17:35:50ID:???
掲示板スクリプトを作っています。

if ($name = ~/fusianasan/){
$name = ~s/fusiansan/<strong>$host<\/strong>/
}
注)$name…名前欄の文字列 $host…$ENV{'REMOTE_HOST'}

とすると、名前欄にfusianasanが入っていてもいなくても
名前欄が4294967295になってしまいます。

また、同様に
foreach (@post_check_list){
~ s/</</gi;
~ s/>/>/gi;
~ s/\r\n/<br \/>/gi;
~ s/\r/<br \/>/gi;
~ s/\n/<br \/>/gi;
~ s/"/&guot;/gi;
~ s/&/&/gi;
~ s/\0//g;
${"$post_check_list2[$i]"} = $_;
$i++;
}
注)@post_check_list = (\$name ,\$mail, \$honbun…
  $nameは名前欄、$mailはメール欄、$honbunは本文
   @post_check_list2 =('name', 'mail', 'honbun'…

とするとメール欄などが全てREF(0x814d354)となってしまいます。

文字コードはeucなのになぜなのでしょうか…知っている方ご教
授いただければ幸いです。
0150nobodyさん05/02/05 17:52:04ID:???
>>149
× = ~
○ =~
0151nobodyさん05/02/05 17:52:11ID:???
>>149
fusianasanのほうは他の処理に原因があるのだろう。
@post_check_listは中身がリファレンスなんだから当然の結果。
eucとかそういう話は無関係。
0152nobodyさん05/02/05 18:36:20ID:???
format関数でテキストの位置制御を行っているんですが
日本語をwriteすると文字化けるというのは仕様でしょうか?
#以下ソース

$hoge = 'test1';
$hoge2 = 'あ';
format STDOUT =
TITLE : @<<<<<<<<<<
$hoge
TITLE2 : @<<<<<<<<<<
$hoge2
.
write (STDOUT);

#$hoge2が化けてます。
0153nobodyさん05/02/05 18:42:39ID:???
>>149
if ($name = ~/fusianasan/){
    $name = "<strong>$host<\/strong>";
}
0154nobodyさん05/02/05 18:52:01ID:???
>>153
アホ
0155nobodyさん05/02/05 19:50:46ID:???
どうでもいいが、こうじゃないのか?

if ($name = ~/fusianasan/){
    $name = "<strong>$ENV{REMOTE_HOST}<\/strong>";
}
0156nobodyさん05/02/05 19:54:28ID:???
$ENV{'REMOTE_HOST'}でホスト名が返ってくる鯖って少なくね?
つか、漏れの借りてる鯖は$ENV{'REMOTE_HOST'}禁止なんだよね。
0157nobodyさん05/02/05 19:55:01ID:???
$name =~ s/fusianasan/<strong>$ENV{REMOTE_HOST}<\/strong>/;

でもいいな。
0158nobodyさん05/02/05 19:55:38ID:???
>>156
禁止だとしたら、$hostってどっから取ってくるんだよ(w
0159nobodyさん05/02/05 19:55:49ID:???
>>155
アホ
0160nobodyさん05/02/05 19:59:10ID:???
>>158
げっとほすとばいあどれす
0161未承諾広告※ ◆TWARamEjuA 05/02/05 21:13:22ID:???
なんだか楽しそうですねぇ。。。
016214905/02/05 21:15:54ID:???
>>150
ありがとうございました。スペースを削除したら上手くいきました。

>>151
リファレンスにせずに、普通に
@post_check_list = ($name ,$mail, $honbun…
としたら上手くいきました。ありがとうございます。

>>155,>>157
それだと、名前欄に「ほげほげ fusianasan」などと入れたときに
ほげほげが消えてしまいます。
0163nobodyさん05/02/05 21:39:54ID:???
>>162
勘違いしてるみたいだけど、~ は正規表現の先頭に付ける文字じゃないからね。
後半のソースは左辺値がないからたまたま期待通り動いてるだけ。
どういう意味があるのかは調べてみてください。
0164nobodyさん05/02/05 22:35:02ID:???
>>149>>153>>155
$name = ~/fusianasan/;
これは
$name = (~($_ =~ m/fusianasan/));
と同じ意味。
0165nobodyさん05/02/05 23:56:22ID:5Rr9/6OZ
ちょっと聞きたいんだけど、沢山出力を吐きたい時に

print << " END_OF_PRINT";
 処理
 END_OF_PRINT

って書くけど、
こんな時に処理部に例外処理が沢山あって

print << " END_OF_PRINT";
 処理A
 END_OF_PRINT
print << " END_OF_PRINT";
 処理B
 END_OF_PRINT
・・・

ってな感じで細かく使わないといけないけど普通のprint文を使うまでも無いって時はどうしてる?
なんかソースが汚く見えるんだよね。
0166nobodyさん05/02/05 23:58:48ID:???
ヒアドキュメントの中に処理が入ってるのが
意味わかんないんだけど。
スペースも意味わかんない。
0167nobodyさん05/02/06 00:31:46ID:???
確かに意味不明だよな。
例えとしてもそんなこと書いているようでは汚いのは当然かも。
0168nobodyさん05/02/06 00:44:01ID:???
万華鏡でも覗きながらソース見れば、綺麗に見えるんじゃないの?
0169nobodyさん05/02/06 00:48:00ID:???
マン毛鏡って素敵♥
0170nobodyさん05/02/06 00:52:30ID:???
なんかムラムラしてきますた
0171nobodyさん05/02/06 01:13:35ID:???
>>165
サブルーチンを分けるか、ファイルを分ける。
スペースは意味わかんないから __END_OF_PRINT__ とか書く。
0172nobodyさん05/02/06 01:18:35ID:???
>>165ってなんでもヒアドキュメントで書いてるのかな。
017316505/02/06 02:10:26ID:???
死ぬわ。
0174nobodyさん05/02/06 05:39:04ID:???
>>165
一度変数に入れてしまう。

my $str_a =<< " END_OF_PRINT";
 処理A
 END_OF_PRINT
my $str_b =<< " END_OF_PRINT";
 処理B
 END_OF_PRINT

print $str_a;
# 何か処理
print $str_b;
0175nobodyさん05/02/06 11:18:05ID:???
print <<EOT1, <<EOT2;
 処理A
EOT1
 処理B
EOT2
0176nobodyさん05/02/06 12:36:07ID:???
そもそもなぜヒアドキュメントの中に処理があるのだろうか。
@{[...]}とか使えばなんでも書けるけどさ...
0177nobodyさん05/02/06 13:01:53ID:???
perlはそういう記述ができるんだからグダグダいってもしょうがない。
0178nobodyさん05/02/06 13:03:56ID:???
別に、自分が納得するように書けばいいだろ。

綺麗とかそういう基準なんて、誰かが勝手に言い出した物で、
別に基準なんかじゃないんだからさ。

自分が後から見て理解できるように書けばいい。
0179nobodyさん05/02/06 13:17:10ID:???
自分の基準だって経年変化する。
0180nobodyさん05/02/06 13:32:38ID:???
Windows環境でPerl5+Apache1.3.xでサーバ動作させています。
複数ファイルのCRC16チェックを行い、その結果を表示するCGIを作ったのですが
1ファイル毎に結果が送られなくて、10個ほど毎にブラウザに返してきます。
これを1個づつこまめにレスポンスを送るにはどうすれば良いのでしょうか?
Unixの場合は $|=1 等で手段が有るようですが、Windows環境では無理でしょうか?
0181nobodyさん05/02/06 14:53:09ID:???
>>180
スレ違い

△▲ WebProg 初心者の質問 Part11 ▼▽
http://pc5.2ch.net/test/read.cgi/php/1101635909/
018218005/02/06 14:55:56ID:???
そうでしたか、向こうに再度カキコしてきました
0183nobodyさん05/02/06 16:44:56ID:fwG0kktY
シロートな質問ですいません。
テキストエリアに表示させる時、改行文字は何になるのですか?

<TEXTAREA COLS=65 ROWS=5 NAME=\"ets\">$ets</TEXTAREA>
と記述し、$etsのデータの改行したいところに\nとか\rとか\r\r\nとか
入れてみたのですが、そのまま表示されます。
0184nobodyさん05/02/06 16:46:35ID:???
>>183
スレ違い

△▲ WebProg 初心者の質問 Part11 ▼▽
http://pc5.2ch.net/test/read.cgi/php/1101635909/
0185nobodyさん05/02/06 17:25:47ID:???
え?
0186nobodyさん05/02/06 17:28:45ID:???
いやそれは半分は合ってるんじゃw
$ets = '〜\n'; みたいにシングルクオーテーションだと \n 、
$ets = "〜\n"; みたいにダブルクオーテーションで書けば 改行 で入ると思う。
0187nobodyさん05/02/06 17:43:51ID:???
遅かった・・・orz
0188nobodyさん05/02/06 17:49:02ID:???
誘導荒しの登場か…。

>>187=>>186?
ドンマイ。
0189nobodyさん05/02/06 17:51:47ID:???
つーか、初心者スレなんだから、問題の切り分けも含めて質問なんじゃないの?
普通に質問に答えてあげればいいと思うが。
0190nobodyさん05/02/06 18:27:41ID:???
>>189
同意。

誘導するなら、その根拠を質問者に示してあげられるといいと思う。
0191nobodyさん05/02/06 18:27:46ID:fwG0kktY
>>186-189
ありがとうございます。
まだうまく行きませんが、WebProg 初心者の質問 Part11の方で
継続して質問しています。
0192nobodyさん05/02/06 18:29:04ID:???
>>189
お前がどう思っているかは関係ない。
0193nobodyさん05/02/06 19:08:28ID:???
>>192
お前がどう思っているかも関係ない。
0194nobodyさん05/02/06 19:29:14ID:???
覚え立ての誘導をやってみたかんたんだよ。

自治初心者スレとか必要だな(w
0195nobodyさん05/02/06 23:57:25ID:???
やってみたかんたんを流行らせたい。
0196nobodyさん05/02/07 10:09:59ID:Xo+VK5jq
メールアドレスを入力してもらってそこに特定の文字列を送るというCGIを作成してます。
メールアドレスをそのまま入力してもらうと正規表現がたいへんなので、
@はこちらで用意して左辺と右辺を別々に書いてもらうことにしました。

入力スペース @ 入力スペース

こんな感じです。そして不正なアドレスだと感知したらメールを送るのをやめます。
右辺は英数字とピリオド以外が混入していたら中止。
左辺は何が混入していたら中止にすればいいのでしょうか?

確かメールアドレスに含んでよい記号ってかなりありますよね;
@を除いてそれら以外が混入してれば中止とすれば安全なのでしょうか?
0197nobodyさん05/02/07 10:28:38ID:???
素朴な疑問です。
よくXSS対策などと言いますが、リファラーを取ってマッチングしない場合は
別の処理をするみたいな事をすればXSSなんて起こりませんよね?

もちろん結局はしないと変なスクリプト掲示板に埋められたり、注文客が
思いっきりスクリプト攻撃したりということがありますが、それってXSSでは
ないですよね。

つまりXSS対策って実はリファラーだけ取れば回避できるんですよね?
それともXSSっていうのの意味には前段落で挙げたようなことも含まれているんでしょうか?
0198sage05/02/07 10:41:49ID:+1BETA+W
>>196
既存のスクリプトを使用した方が早くないか?
>確かメールアドレスに含んでよい記号ってかなりありますよね
普通はアルファベットと数字、アンダーバーやハイフン程度だろ

>>197
しかしそう簡単にはリファラーを渡さないのがノートン先生ですよ
019919605/02/07 10:55:01ID:Xo+VK5jq
>>198
ドメイン側は
$domain =~ /[^\w\.]/;
としていてこれにマッチするなら不正と考えます。
ユーザ名側は確か通常URIに含められる文字列なら全て含めることができたような記憶があるんですよね;

print MAIL "to: ".$user.'@'.$domain."\n";

みたいにするんですが、UNIXには詳しくないのでどういう文字列を渡すと危険なのかが
把握できていません・・・

$user =~ /[^\w\-]/;
これだと実際には正常なアドレスなのに送れないケースが出てくると思うんですよね。
やはり既存のフォームメールスクリプトを探すのが早いですかね?
さっきPerlメモ読みましたが、ユーザ名側で何をエスケープするべきかは書いてなくて
ややこしいコードだけがありました。

ユーザ名側に含めることができる記号一覧があるRFC文書を探してますが、
英語に悪戦苦闘ですorz
0200nobodyさん05/02/07 10:55:14ID:???
>>196
正規表現以外でやろうとする方が大変。
ちなみに携帯のメールアドレスとか規格に則してなかったような。

>>197
リファラは偽装できる。
020119705/02/07 11:15:16ID:???
そういうことか・・・・・・
やっぱ俺って天ちゃんなのね
0202nobodyさん05/02/07 11:15:29ID:???
>>196
>>198
メールアドレスのローカルパートって他の世界のメールシステムとの
やりとりもありうるので適切にエスケープすればほぼなんでもありの
仕様になっています。rfc2821の4.1.2にBNFがあるのでLocal-partって
とこを見ればいいですが、「"」でくくってQuoted-stringにすれば\を
前に置くことでCR,LF以外の任意の文字を書くことが出来ます。

くくらない場合は、英数字または「!#$%&'*+-/=?^_`{|}~」からなる1文字
以上の文字列、またはそれをを「.」をはさんで複数つなげたものが許され
ます。ただし、一部のケータイなどで連続した「.」を含んだり末尾が「.」
で終わる仕様に違反したアドレスを許しているので、あまり厳しくチェック
すると文句がでるかもしれません。

これを気にしなくてよければEmail::Validそのままでいいんだけどね。


0203nobodyさん05/02/07 11:16:20ID:???
2chが使ってる公開串リストによる規制が簡単に組み込めるみたいなので
http://bbq.uso800.net/code.html
にあるBBQによる方法で導入してみました
動作確認したいのですが公開串って何処で公開されてるんでしょうか
0204nobodyさん05/02/07 12:26:41ID:???
>>196
perlに関係ないじゃん。
rfcでアドレスに使える文字を調べないさいよ。

>>203
板違いだね。
初級ネット板かセキュリティ板へ。
0205nobodyさん05/02/07 13:02:28ID:???
>>201
天然ちゃん?
0206nobodyさん05/02/07 13:24:25ID:???
>>203こそ誘導すべきなのに、誘導厨は、いつも見当外れだな。
0207nobodyさん05/02/07 13:29:03ID:???
誘導されてるけど?
0208nobodyさん05/02/07 15:47:18ID:???
ファイルを開いて書き込み中に他のプロセスがファイルを開けて囲うとすると
壊れますよね。
いわゆる排他処理って言うと思うんですが、今まで一度もやったことがありません。

Perlの経験はネットショップをmysqlとの連携で構築したりその他ちまちましたものばかりです。
基本的にファイルではなくDB連動ばかりだったので勝手に排他処理をしてもらってたせいで。

どこかPerlでやる排他処理について詳しいサイトありますか?
一応windowsでもUNIXでも共通の方法を探してます。
0209nobodyさん05/02/07 16:15:16ID:???
>>208
排他処理は難しい
多分このスレの半分はできないだろう
それくらい難しいし面倒だ
0210nobodyさん05/02/07 19:09:05ID:???
>>207
今回は違う人が誘導したんでしょ。
誘導厨フォーマットじゃないし。

↓

>>000
スレ違い

△▲ WebProg 初心者の質問 Part11 ▼▽
http://pc5.2ch.net/test/read.cgi/php/1101635909/
0211未承諾広告※ ◆TWARamEjuA 05/02/07 19:20:38ID:???
>>203
【BBQ 3本目】公開串登録所 【ピンポイント規制】
http://qb5.2ch.net/test/read.cgi/sec2chd/1105274729/l50

ここを眺めればいくらでも(w
0212nobodyさん05/02/07 20:05:31ID:???
>>210
おまい何でそんなに必死なん?
0213nobodyさん05/02/07 21:02:12ID:???
誘導厨の方が、明らかに必死だ罠
0214nobodyさん05/02/07 21:42:44ID:???
いいや、反応してるほうが相当に必死に見える。
0215nobodyさん05/02/07 21:54:28ID:???
nfkやmob_PaqlだったらFLOCK最強!
0216nobodyさん05/02/07 21:57:08ID:???
>>215
お前のエンゲージリングはプルタブ
0217nobodyさん05/02/07 23:02:26ID:???
だから誘導してみたかったんだけだろ
0218nobodyさん05/02/07 23:05:47ID:???
# main.cgi
#!/usr/bin/perl
require './require.pl';
&hogehoge;
# hogehoge2を呼び出さずに終了
exit;
-------------------------
# require.pl
sub hogehoge{
(中略)
}

sub hogehoge2 {
(中略)
}
--------------------------

この場合に呼び出していない、require.plのhogehoge2はコンパ
イルされるのでしょうか。
それとも、呼び出さなければコンパイルされないのでしょうか。
教えていただければ幸いです。
0219nobodyさん05/02/07 23:18:56ID:???
>>208
ttp://homepage1.nifty.com/glass/tom_neko/web/web_04.html
http://web.archive.org/web/20040216083853/www98.sakura.ne.jp/~jun/perl/flock.html
0220nobodyさん05/02/07 23:34:49ID:???
>>218
コンパイルされるはず。

それをなんとかしたければAutoLoaderについて調べてみるといい。

0221nobodyさん05/02/07 23:39:55ID:Cfgr4b2r
>>196
Email::Valid
Email::Valid::Loose
Docomoの変なのもおっけ
到達可能かもみます
0222nobodyさん05/02/07 23:43:35ID:???
>>220
コンパイルされますか…

# main.cgi
#!/usr/bin/perl
$_ = 1;
if ($_ == 1){ require './require1.pl }
elsif ($_ == 0){require './require2.pl'}
&hogehoge;
# require2.plを呼び出さずに終了。hogehoge2を
# コンパイルしない分負荷が減る
exit;
----------------------
# require1.pl
sub hogehoge {
(中略)
}
----------------------
# require2.pl
sub hogehoge2 {
(中略)
}
-----------------------
みたいな感じで別ファイルにして対処しようと
思います。ありがとうございました。
0223nobodyさん05/02/08 02:09:22ID:???
そんなんで負荷が減るとでも?
0224nobodyさん05/02/08 02:15:40ID:???
つまんないことに熱心になるやつっているもんだな。
0225nobodyさん05/02/08 02:54:05ID:???
ああ、誘導とか?
0226nobodyさん05/02/08 03:39:12ID:???
いや、その誘導に拘っていつまでもグダグダ言ってるやつのこと。
0227nobodyさん05/02/08 03:43:09ID:???
誘導を注意してる奴って複数居るけど、誘導厨って一人だよね?
なんでこんなに即レスなの?
0228nobodyさん05/02/08 03:51:50ID:???
暇なんじゃない?
0229nobodyさん05/02/08 13:26:19ID:???
誘導を注意してる奴のほうが一人だろ。
いつも誘導に反応する奴なんてまったくいないのに。
何人もいるように見せかけているが、近い時間に書いてるし。

いずれにしても注意してるヒマがあったら、ここでも誘導先でも
答えてやればいいのに。
0230nobodyさん05/02/08 15:05:46ID:???
>>224-229
暇だなお前ら。

>>231
質問ドゾ。
0231nobodyさん05/02/08 16:47:26ID:???
>>230
ご趣味はなんですか?
0232nobodyさん05/02/08 16:58:30ID:???
ショップとか掲示板とか何ページあろうが1個のCGIで済ませるときって
みなさんはページ移動をどうやってますか?

私は今まで
if ( $form{page} eq "hoge") {#hogeページの処理

}elsif( $form{page} eq "hage" ){#hageページの処理
}

こうしてました。で、ふと思ったのですが、もしかしてページごとにサブルーチンに
しておいて、$form{p}の値を見てどのルーチンを呼ぶかを分岐させた方が
わかりやすいかもって。

みなさんはどうやってますか?
0233nobodyさん05/02/08 17:00:00ID:???
>>232
ページごとに小さかったらサブルーチン、大きかったらファイルに分けちゃう。
0234nobodyさん05/02/08 18:38:16ID:???
>>229
誘導厨には誰も賛同しないからレスが着いてないだけだろ
0235nobodyさん05/02/08 18:48:30ID:???
お!注意厨が現れたね。
同じぐらいに時間に登場とはわかりやすい。
0236nobodyさん05/02/08 19:24:33ID:???
なんか、道ばたでタバコ吸ってるの注意されたけど、
お前に何の権利があるんだよとか、いちいち注意してんじゃねーよとか
意味不明な反抗をする高校生みたいになってきてるな。
0237nobodyさん05/02/08 19:25:19ID:???
あと、こんな時間に見回りなんてヒマだなとか、お前の息子だってやってんだろ?とか言うな。
0238nobodyさん05/02/08 21:06:40ID:???
>>232
4つぐらいならifで分岐させるけど、
それより多くなったらテーブル使うかな。
0239nobodyさん05/02/08 21:45:37ID:???
画像掲示板でHTMLを書き出すタイプのスクリプトを組みました。
そこで画像サイズを取得し、<img width="***" height="***" src="***">のように書き出そうと
Image::Size を使用しようとしましたがサーバーにはインストールされておらず、 Size.pm を設置する事にしました。

ローカルでは README.win32 に書かれたとおりの編集をし
perl/site/lib/Image/Size.pm に置く事で動きました。

サーバーに設置する事も想定し、スクリプトのあるフォルダに
lib/Image/Size.pm と設置し、スクリプトに use lib "lib"; の記述で動くことも確認しました。

そして、サーバーに同様の構造で「未編集」の Size.pm を設置しましたが動きませんでした。
# 正確にいうと ($width, $height) = imgsize("$file_name"); で止まるようです。
しかし、 README.win32 に書かれた編集を施した Size.pm では無事に動きました。

実際にした編集というのは use AutoLoader 'AUTOLOAD'; と __END__ の2行を消しただけです。

何故、 Win 用の編集で動くようになったのでしょうか?
動くようになったこと自体はいいのですが、サーバー側に迷惑をかけてる可能性はありますでしょうか?
■ このスレッドは過去ログ倉庫に格納されています