Perlコーディング初心者質問スレ Part 38
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
04/10/07 23:23:08ID:kiEzDCJF【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0790nobodyさん
04/11/18 13:38:18ID:???説明不足ですいません。
BBSのログで、保存する時点ではタグに関わる記号&;<>は全てデコードしてあります。
で、読み出して表示する際に許可したタグのみ有効にする仕組みになってて、fontタグのみ有効にしてます。
0792789
04/11/18 13:54:44ID:???0793nobodyさん
04/11/18 14:08:47ID:???こうかなあ。
0795nobodyさん
04/11/18 16:41:16ID:???って事にしました。
0796nobodyさん
04/11/18 17:13:54ID:???0797nobodyさん
04/11/18 17:54:10ID:???&hiroyuki; → &hiroyuki;
みたいに実態参照が定義されていない場合のみ & をエスケープしようと思ったら、
定義されているやつを全部リストとかで持ってないとダメなんだろうか。
使えるモジュールとかありますか?
0798nobodyさん
04/11/18 18:15:24ID:???HTML::Entities
decode_entitiesに食わせて変化するか(定義されていれば変化する)
または、
%entity2charハッシュのキーにあれば定義されている
といったあたりでいけると思う。
0800nobodyさん
04/11/18 19:09:44ID:???ありがとう。うまくいってるようです。
でも借りてるサーバーには HTML:: が無いんだけど、まあコピーして置いとけば動くだろう。
0801nobodyさん
04/11/18 19:59:02ID:???すいません。<>も&lt;&gtに変換された状態なのを説明してませんでした。
<>のままの状態だと>>793さんので出来ました。
0802nobodyさん
04/11/18 21:45:59ID:???s!<(/?font\b.*?)>! (my $s=$1) =~ s/"/\x22/g; "<$s>" !egis;
ではどう?
<font **>と</font>の両方を < > も含めて戻せると思うんだけど。
0803nobodyさん
04/11/18 21:57:39ID:???ばっちり復元出来ました!すげー!
FONTタグで囲まれたデータ部分の&lt;&gt;&quot;はそのままで、
タグの記述部分だけちゃんと変換されてます。
ありがとうございました!
0804nobodyさん
04/11/19 08:46:55ID:???telnetモジュールを使用して、リモートコンピュータに接続してから、
・screen起動
・外部プログラム起動
・CTRL-A d で[detached]
という操作をperlで実行したいのです。
色々サイトを回って調べて、telnet接続まではできたのですが、
上記手順の「CTRL-A d で[detached]」で行き詰っております。
CTRL-Aという操作をperlのtelnetモジュールで行うには、
どういう記述をすればよいのでしょうか?
0805804
04/11/19 10:44:06ID:???何でscreenを使用したいかというと、
webブラウザ上で、サーバのプログラムを起動させ、常駐させたいからです。
通常のデーモン(inetdなど)であれば、わざわざscreenなど使わなくても
telnetモジュールで接続させ、コマンドを実行させればよいのですが
今回起動させたいプログラムは、バックグラウンドで動作してくれないため、
常にコンソールを開いておく必要があるのです。
なので、仮想的に常駐させるためにscreenを選んだというわけです。
当方、UNIX系OSに触れて1週間足らずなので、
「screenなんて使わなくても この方法でいいだろバカ」
という意見なども助かります。
0806nobodyさん
04/11/19 10:59:05ID:n9OG7mgXswfに表示するということをやっております。
画像は正しくロードできるのですが、ファイルサイズが取得できず、
ローディング表示ができなくて困っています。
詳しく説明します。
まずswf内で
_root.[object].loadMovie("hoge.cgi", "POST");
を使い、ロードの要求をします。
するとhoge.cgiでimageMagickというモジュールを使い、
縦横サイズを変更します。ここでPOST送信されている
stageWとstageHとranはswfから送られてくる変数です。
0807806
04/11/19 10:59:50ID:n9OG7mgX---
use Image::Magick;
if($ENV{'REQUEST_METHOD'} eq 'POST') {
read(STDIN, $query, $ENV{'CONTENT_LENGTH'});
}else {
$query = $ENV{'QUERY_STRING'};
}
foreach $pair (split(/&/, $query)){
my ($key, $value)=split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$form{$key}=$value;
}
$i = Image::Magick->new;
$img="img/cover$form{'ran'}.jpg";
$i->Read($img);
($width, $height)= $i->Get('width', 'height');
if($width/$height>=$form{'stageW'} / $form{'stageH'}){
$newwidth =$width*$form{'stageH'}/$height;
$i = $i->Transform(geometry=>$newwidth);
}else{
$newwidth= $form{'stageW'};
$i = $i->Transform(geometry=>$newwidth);
}
print "Content-type: image/jpeg\n\n";
binmode(STDOUT);
$i->Write("jpeg:-");
undef $i;
exit;
---
0808806
04/11/19 11:00:52ID:n9OG7mgX--
そして戻ってくる画像データをswf内にて
getBytesLoaded()やgetBytesTotal()で調べています。
するとロードされたバイト数はしっかり取得できているのに
対し、総ファイルサイズはロード中はずっと0になっていて、
ロードが完了すると総ファイルサイズが表示されます。
OS FreeBSD
perl 5.8.x
Flash ver.6.0
どうか、よろしくお願いいたします。
0809nobodyさん
04/11/19 12:30:01ID:???0810nobodyさん
04/11/19 13:49:59ID:???read STDIN,$alldata,$ENV{'CONTENT_LENGTH'};
を実行したら$alldataの中身は変わってませんでした。
原因はどこですか?
0811810
04/11/19 14:33:50ID:???0812nobodyさん
04/11/19 15:43:47ID:???真横に表示させることはできないのでしょうか?
ttp://spiral.lib.net/cgi/mc/
0813nobodyさん
04/11/19 15:47:41ID:???0816nobodyさん
04/11/19 19:45:10ID:???($tmp) = "hoge";
とか。
これは何の意味があるんでしょう?
0817nobodyさん
04/11/19 20:16:23ID:???その例ではまったく無意味かと
($foo, $bar) = @_;
とかやると
$foo = $_[0];
$bar = $_[1];
の効果が得られる。
多分書いた人の癖じゃないか?
0818nobodyさん
04/11/19 20:26:47ID:???レスありがとうございます。
某レスQのCGIにしばしば出現てて悩みました。()の中はスカラ変数が一つだけなんです。
実際は右辺はサブルーチンだったりするんですが、配列は戻ってこない。
($ret) = &getMessage("$filename$EXT");#戻り値は0か1
とか。
悩むのやめときます。
0819nobodyさん
04/11/19 22:09:11ID:???0820804
04/11/19 22:47:11ID:???レスありがとうございます。
/dev/nullについて調べて、実際に動かしてみました。
要するに出力をポイっとやるわけですよね?
末尾の2>&1は何でしょうか?色んなサイト調べてみましたが、
nullの動作に触れてるところばかりHITしたらしく。。orz
nohupもためさせてもらいました。
動作的にはscreenと似ているので、助かります。
しかし、nohupすると、私のUNKサバではかなり重くなってしまいます。。
出力を書き込んでいるからでしょうか?
あと、nohupや &での開始だと、telnetモジュールを切断させた後
ジョブをフォアグラウンドに復帰させる方法が見当つきません。。
我侭ばかりですいません。よろしくお願いします。
0821804
04/11/19 22:50:33ID:???割り込みキー入力(今回の場合はCTRL+A)を
perlからコンピュータに送信する方法はあるのでしょうか?
板汚し申し訳ないorz
0822nobodyさん
04/11/19 23:02:34ID:???そうやっておくと、もし2つ以上の返り値があった場合に
最初の値だけ取って、残りを捨てるということができる。
安全策ってわけだな。
あまり誉められたものではないと思うけど。
0824nobodyさん
04/11/19 23:09:06ID:???0825823
04/11/19 23:20:43ID:???おっと2>&1についてもついでに答えるんだった・・・
「標準エラー出力を標準出力に纏める」という意味。
nohupが重くなる理由はmanに書いてあったぞ
> スケジューリング優先度は 5 増やされるので、
> 実行の割り当て時間はやや小さくなる。
そんなに大きく変わるかは知らないが
0827nobodyさん
04/11/20 04:13:04ID:???ある, 改行コードがCR+LFのテキストファイルがアップロードされた際, 改行コードをLFに
変換し, そのファイルを保存するcgiを書きたいのですが, 以下のように書いてみましたがうまくいきません.
LFに変換されずCR+LFのまま保存されてしまいます.
#!/usr/bin/perl
use CGI;
$query = new CGI;
Content-type: text/html\n\n
$fn = $query->param('filename');
$type = $query->uploadInfo($fn)->{'Content-Type'};
if($type =~ /^text\//){
open(FILE,">test.txt");
while (<$fn>) {
$temp = $_;
$temp =~ s/\r\n/\n/;
chomp($temp);
print FILE "$temp\n";
}
}
どのようにしたらいいでしょうか?宜しくお願いします.
0829nobodyさん
04/11/20 08:04:12ID:???>>809のContent-Lengthは、レスポンスの方だと思う。
print "Content-type: image/jpeg\n";
print "Content-length: $filesize\n\n";
で、$filesizeにjpegデータのサイズを入れておく。
(一旦テンポラリファイルを作らないとだめかも知れないけど)
0830nobodyさん
04/11/20 08:31:32ID:???バイナリモード binmode を参考に
0832nobodyさん
04/11/21 07:32:38ID:???screen使った事ないけど、man読んでみた限りでは、
-d -Dでいけるんじゃ?
それから、うに板の方が適切な質問じゃないかと。
0833nobodyさん
04/11/21 12:49:54ID:???...
}
の中で現在の行番号を取得する良い方法はありませんか?
$_ == $list[$hoge] になるような $hoge が知りたいのですが……。
カウンタ変数を新たに作るしかないんでしょうか。
0834806
04/11/21 13:04:12ID:Ewup0dSnお力添え、ありがとうございます。
早速やってみます!!
0837nobodyさん
04/11/21 18:47:52ID:8gMC3V6h一応入力チェック(サニタイジング)として、like演算子のワイルドカードである
「%」と「_」があったら削除してます。
よく考えたら「_」はメールアドレスとして普通に使われてる可能性があるんですよね。
そこで質問ですが、_これってlike演算子以外では安全ですよね?
DBIのprepare時にプレースホルダを使用してるのですが、みなさんは_対策とかしてますか?
0839nobodyさん
04/11/21 19:01:17ID:ubTrO76Hif ($user_agent[0] eq 'DoCoMo') { $URL=$iURL; }
elsif ($user_agent[0] eq 'J-PHONE') { $URL=$vURL; }
elsif($user_agent[0] eq 'UP.Browser' || $user_agent[0] =~ /^KDDI/) { $URL=$eURL; }
else { $URL=$pURL; }
print "Location:$URL\n\n";
print "Content-type: text/html\n\n";
print "<HTML><HEAD><META HTTP-EQUIV=\"REFRESH\" CONTENT=\"10;URL=$URL\"><TITLE>auto jump</TITLE></HEAD><BODY><A HREF=\"$URL\">自動でジャンプしない場合はこちらから</A></BODY></HTML>";
exit;
というのでHPを携帯なら携帯で察知して携帯用HPに
飛ばすようにしているのですが
話題の京ぽんを携帯用に飛ばしたいのですが出来ません。
ご教授ください。
0841nobodyさん
04/11/21 19:48:30ID:w/cY/u9z@hoge=$url=~m/http:\/\/[-_.!~*'\[\]\(\)a-zA-Z0-9;\/?:\@&=+\$,%#]+/gi;
で
<a href="http://gaerge">fgagear</a>
とかを取得すると、
http://gaerge">fgagear</a>
となってしまいます。
どこをどう直せばいいんでしょうか。
0843nobodyさん
04/11/21 20:07:53ID:w/cY/u9z正規表現メモを参考にしたんですが。
0844nobodyさん
04/11/21 20:55:58ID:???AirWiki: AirH"PHONE/AH-K3001V/FAQ
http://d.memn0ck.com/index.cgi?AirH%22PHONE%2FAH-K3001V%2FFAQ#i15
>>841
my $url = qq{<a href="http://gaerge">fgagear</a>};
my @hoge = $url =~ m/http:\/\/[-_.!~*'\[\]\(\)a-zA-Z0-9;\/?:\@&=+\$,%#]+/gi;
print "@hoge";
問題なさそうだけど。
0845nobodyさん
04/11/21 20:57:55ID:???コピペして @hoge を print してみたけど
http://gaergeになったよ
0846841
04/11/21 21:33:14ID:???正規表現事態は間違ってないみたいですね。
しかしなんでだろう・・
0847nobodyさん
04/11/21 22:26:23ID:hibhMAEScgiサーバーからhtmlサーバー内のログファイルを読み込むには、別サーバなので、
ソケットを使わなければいけないということで、とりあえずトップページを表示させようと、
次のソケットスクリプトを実行してみました。
$host = "www.xxxxxxxxxxx.com";
$page = "/";
$line = "";
$addr = (gethostbyname($host))[4];
$name1 = pack("S n a4 x8", 2, 80, $addr);
socket(S, 2, 1, 0);
connect(S, $name1);
binmode(S);
select(S);
$| = 1;
select(stdout);
print S "GET $page HTTP/1.0\r\n\r\n";
while (<S>) { $line .= $_; }
close(S);
print $line;
ページの指定を$page = "/index.html";にするとNot Found
$page = "/";にするとForbiddenという反応が返ってきてうまくいきません。
これはただ、パスの指定が悪いだけなのか、やはりサーバーの設定で
ソケットが使えないようになっていて、cgiサーバーからhtmlサーバーの
ファイルを読み込むのはあきらめなければならないということでしょうか?
0849nobodyさん
04/11/21 22:50:12ID:???0851839
04/11/21 22:51:26ID:ubTrO76Hどれもだめです。
そもそもの書き方を間違えているのでしょうか?
0853nobodyさん
04/11/21 23:48:01ID:???京ぽんつーのが何なのか知らないが、elseの中でUA名を表示させてみれば
どういうUA名で分岐すればいいのか分かるのでは?
0854nobodyさん
04/11/22 00:59:03ID:???いちいち1ファイルごとに読み込んでマッチ処理の繰り返しでは負荷的にも問題あるので、
データディレクトリでgrepかけて、該当したファイルのみ読み込みたいのですが、
perlでやるにはどうすればよいでしょう?
0855nobodyさん
04/11/22 01:10:34ID:???最もシンプルな記述はどんな感じになりますか?
0857nobodyさん
04/11/22 01:18:25ID:???0858nobodyさん
04/11/22 01:22:50ID:???>>1
【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
0859nobodyさん
04/11/22 01:25:58ID:???open(IN,"grep '$keyword' file|");#実際にgrepを実行する
って手があるが、鯖によってはgrepはダメかもしれない。
ファイル名の検索ならFile::findで一発なんだが・・・。
0860855
04/11/22 01:31:38ID:???ifで書くと長いので。
>857
多謝。
0863nobodyさん
04/11/22 02:20:18ID:???ファイルの数が多ければ grep の方が軽いが、
少ないなら perl の中でループ回す方が鯖にやさしい。
てのはコーディングというより負荷軽減スレにふさわしい話題だが。
0865nobodyさん
04/11/22 03:28:27ID:???0866nobodyさん
04/11/22 04:23:59ID:???0867nobodyさん
04/11/22 04:47:42ID:???0868nobodyさん
04/11/22 05:42:53ID:/gdSyseW>>852
>print S "GET $page HTTP/1.0\r\nHost: $host\r\n\r\n";
hostを入れたら違う反応が返ってきて次のメッセージが表示されました。
HTTP/1.1 200 OK Date: Sun, 21 Nov 2004 20:36:26 GMT Server: Apache/1.3.27 (Unix) Last-Modified: Thu, 11 Nov 2004 02:34:45 GMT ETag: "718102-ddd-4192cfc5" Accept-Ranges: bytes Content-Length: 3549 Connection: close Content-Type: text/html
ただ、期待したトップページは相変わらず表示されませんでした。
このメッセージからソケットが使えるって判断できるでしょうか?
0869nobodyさん
04/11/22 06:30:29ID:/gdSyseWトップページにはフレームを使っているので、表示されないみたいです。
取得したいログファイルを指定したら、見事に表示されたので、ソケットは使えることは確認できました。
ただ、次の応答メッセージが頭にくっついてくるので、これを取得しないようにすることはできるでしょうか?
HTTP/1.1 200 OK Date: Sun, 21 Nov 2004 20:36:26 GMT Server: Apache/1.3.27 (Unix) Last-Modified: Thu, 11 Nov 2004 02:34:45 GMT ETag: "718102-ddd-4192cfc5" Accept-Ranges: bytes Content-Length: 3549 Connection: close Content-Type: text/html
0871nobodyさん
04/11/22 07:06:38ID:???ヘッダの最後は
CRLFCRLF(最低限LFLF)
になってるので、取得した後、そこまでカットすれば問題ないっしょ。
0872nobodyさん
04/11/22 07:20:47ID:/gdSyseW取得した後で加工してカットするということですか?できれば、取得時にカットしたいのですが、
不可能であれば、最終手段はそうするしかないですね。
0873nobodyさん
04/11/22 07:48:05ID:???<>で読むなら、空行が出るまで別の変数に入れておくとか、空読みするとか。
あと、socketとconnectのエラー処理をした方がいいよ。
0874nobodyさん
04/11/22 08:44:18ID:???0875nobodyさん
04/11/22 10:28:03ID:/gdSyseW素人考えで申し訳ないですが、GETのところでオプションなどをつけてその応答メッセージを
出さないようにすることってできないものですかね?
HTTP/1.1 200 OK 〜〜text/html 取得したログファイルの内容〜
取得した内容は↑のようになっていて、応答メッセージと取得したログの間は半角スペースと
なっています。
応答メッセージを取得時にカットできない場合、取得後にカットするわけですが、シンプルに
カットするには、どういう方法があるでしょうか?perl初心者なもので、たびたびすみません。
0876nobodyさん
04/11/22 11:44:54ID:???チミはx68userのページ見て勉強してから出直すといい。
http://x68000.q-e-d.net/~68user/
別の解法: 他の人も言っているがLWPというチミがやりたいことをそのまま提供している
モジュールがあるので、そっちを使うと簡単。
「原理を理解しなくても目的を達成できりゃいい」という事ならばこっちをすすめる。
0878806
04/11/22 11:50:53ID:dylfkRdnprint "Content-type: image/jpeg\n";
print "Content-length: $filesize\n\n";
と書いてみました。swf側でファイルサイズを取得できて大喜びだったんですが、
jpg画像が途中から壊れて表示されるようになってしまいました。
>(一旦テンポラリファイルを作らないとだめかも知れないけど)
すみません。調べてみたのですが、ちょっと意味が。。。
0879nobodyさん
04/11/22 12:00:44ID:???もしContent-lengthをつけただけでそうなったのなら、
$fileseizeの値がおかしい可能性が高いな。
0880806
04/11/22 13:03:45ID:dylfkRdnレス、ありがとうございます!
print "Content-type: image/jpeg\n";
print "Content-length: 100000\n\n";
とかやってみたのですが、やはり画像が壊れて表示されます。
(こんなことしてはいけないのかな。。。)
0881806
04/11/22 13:14:51ID:dylfkRdnできました!!
やはり値がうまく入っていないだけでした。
ただ
($width, $height, $filesize)= $i->Get('width', 'height', 'filesize');
と値をとっただけなのでリサイズ前のファイルサイズがとれているだけなのですが。
テンポラリファイルとは一度このファイルをtmp.jpgとかにしてそのファイルサイズを
を測らなくてはならないという意味だったのでしょうか?
0882nobodyさん
04/11/22 14:04:38ID:/gdSyseWhttp://x68000.q-e-d.net/~68user/
x68userのページで、「HTTP クライアントを作ってみよう」という記事を見ましたが、
どうもヘッダを除いてボディだけを出力するというのはできなさそうに感じました。
LWPについてはx68userのページで一通り見ましたが、掲載されていないように
見受けられるので、いろいろ検索してそれらしい解説ページを見ましたが、
使用方法について内容の濃いページを見つけられませんでした。
一般的にどのサーバーにもLWPのモジュールが入っているのか?、当方のレンタル
サーバーでLWPは使えるのか?といった辺りからよくわかりません。
(見当違いなことを言っていたらごめんなさい。)
結局、ソケットでヘッダー(応答メッセージ)も含めてファイルを取得し、文字列操作
して、わざわざいらない部分を取り除かなければならないことになりそうです。
同じサーバーならopenしてファイルを参照できるのに、他サーバーのファイルを
参照するだけで、えらく苦労しています。
0883nobodyさん
04/11/22 14:15:38ID:???ボディだけ欲しいならHTTP/0.9で取れるが、HTTP/0.9はHostを送れないのでチミのホストでは駄目。
でも、ヘッダー読み飛ばすのなんか楽勝でしょ。
http://x68000.q-e-d.net/~68user/net/http-2.htmlだと38-41行
0884nobodyさん
04/11/22 14:30:16ID:C0NQJmHQそこに添付されてきた画像ファイルをCGIで読み込み
メインアカウント(例:main)内にあるフォルダに保存させています。
読み込むCGIをgetmail.cgiとするとこれを手動で実行すると
問題なく動作するのですが
crontabを用いて自動実行させると添付ファイルの保存がされません。
crontabによりgetmail.cgiは動作しているものの
保存のみがされないようです。
0-59/2 * * * * cd /home/sites/www.xxx.jp/web && /home/sites/www.xxx.jp/web/mailget.cgi
で実行させています。
環境はRed Hat Linux 7.3
Apache 1.3.27
Sendmail 8.11.6
です。ちなみに、別のレンタルサーバー(FreeBSD)では動作していました。
原因がどこにあるのかご教授ください。
0885nobodyさん
04/11/22 14:31:03ID:???>参照するだけで、えらく苦労しています。
いやそれはそういうモノだ
Perlコーディング以前の「コンピュータが動くしくみ」とかいう次元の問題として
0886nobodyさん
04/11/22 14:54:17ID:/gdSyseWひとまず、ご指摘の箇所を適用してヘッダーを読み飛ばし、ボディだけ抽出できました。
ありがとうございました。
0888nobodyさん
04/11/22 15:58:18ID:???実行ユーザ名・使用するファイルのパミッション・使用する環境変数等々
チェックすることはいっぱいあるよ。
んでも、エラーを適切に処理してればどこでコケたか分かるでしょ?
>>887
初心者自体がセキュリティフォールです。はい。
0889nobodyさん
04/11/22 15:59:51ID:???0890nobodyさん
04/11/22 16:04:25ID:C0NQJmHQ>>888さん、ありがとうございます。
色々チェックしましたがイマイチ解りません。
ブラウザから実行した場合は正常なのですが
crontabで自動実行した場合のみ保存がなされません。
調べたところ、添付ファイルの取り込みも問題ないようで
問題なのはopenして書き込む部分が実行されていないと言うことです。
ファイルの所有者とグループが違うのかと思ったのですが
これらは変更したりできるのでしょうか?
■ このスレッドは過去ログ倉庫に格納されています