【Perl】初心者コーナー Part19
レス数が900を超えています。1000を超えると表示できなくなるよ。
0001nobodyさん
03/02/09 00:24ID:s0tpWWxg1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
CGIだけど、なんか質問ある? Part 9
http://pc.2ch.net/test/read.cgi/php/1041530204/
参考書籍の話題は【Perl,CGI】参考書籍 第三版
http://pc.2ch.net/test/read.cgi/php/1030209573/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般/Part2】
http://pc.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は 【 スクリプト改造工房 PART 5 】
http://pc.2ch.net/test/read.cgi/php/1028193595/
あとは>>2-10。
0810nobodyさん
03/03/12 15:54ID:eDO5fFOYという正規表現を書こうとしたんですが
どうも書き方が解らず for 文になってしまいます。
どなたかお手本を見せてもらえないでしょうか。
お願いします。
0811nobodyさん
03/03/12 15:57ID:NGPUyx9R数値だよね?
($n % $i == 0)
0813nobodyさん
03/03/12 17:56ID:bplOKqH9思い立ち、エイヤっと全部まるまる取ってしまったら、なんか
すごくスクリプトがスッキリ見えて、前よりも理解しやすくなっ
た。。。。という経験ないすか?
0815nobodyさん
03/03/12 21:54ID:???スクリプト内で取得したメールアドレスを$mailという変数に
格納し、メールのテンプレートを外部ファイルから読み込んで
送信したいのですが、ヘッダ部分にTo: "$mail"と記述していても
変数展開が行われません。
外部ファイル内にある変数は展開できないのでしょうか?
0818815
03/03/12 22:32ID:???メインルーチンの中で、$mail="[email protected]";
となっています。で、外部ファイルでは
To: $mail
From: [email protected]
Subject: hoge
<以下メール本文>
という構造です。このテンプレートファイル名が$fileに格納されているとき、
open (BODY,"$file");
@mail_body=<BODY>;
close (BODY);
としています。
0820nobodyさん
03/03/12 23:09ID:???s///はスカラのみが対象になるかと。
スマートにやるなら、HTML::Templateをお勧め。
0821815=818
03/03/12 23:27ID:???返答ありがとうございます。
最初、s///で自力でやってみたのですが、$をエスケープするのを
忘れていたり、818さんのように配列ごとs///を作用させてしまい
エラーが出っ放しだとか、いろいろありましたが、現在は以下のように
しました。
$body="@mail_body";
$body=~ s/\$mail/$mail/gs;
スマートな方法ではないですが、一応動きました。
Perlは自由度が高くてうれしいのですが、反面そのおかげで、
結構悩んでしまいますね。。。
0822nobodyさん
03/03/13 00:54ID:???もうちょっと基礎(コンテキスト、リテラル)から勉強せい
$body="@mail_body";とかかなりむちゃくちゃ(わかってあえてやってるならいいけど)
0823nobodyさん
03/03/13 12:33ID:Am3iEG5gopen FI, 外部ファイル;
foreach(<FI>) {
s/%_(\w+)_%/${$1}/eg;
$mail_txt .= $_;
}
close FI;
で、どだろう。
0824nobodyさん
03/03/13 15:56ID:???タイトル($sub)をhtmlに書き出す時だけ
**文字以上だったら2バイト切って、"…"を付ける
ってことをやりたいんですが
どこにどう付け加えればいいでしょうか?
ご教授お願いします。
0825nobodyさん
03/03/13 16:23ID:???if ( length ( $sub ) >= ** ) {
$sub = substr ( $sub, 0, length ( $sub ) - 2 ) . '…';
}
** は文字数ではなくバイトで指定
0827nobodyさん
03/03/13 16:34ID:???0829山崎渉
03/03/13 16:55ID:???0830824
03/03/13 17:07ID:???タイトルは半角で書く予定なので文字化けは大丈夫です。
>>825
どこに記述すればいいんでしょうか?
投稿処理の時点で$subではなくsubに置き換えて…無理ですね。
0832nobodyさん
03/03/13 21:45ID:PyTQVFy/$bbb = '123';
$ccc = '456';
・
・
・
$datafile = "ddd.txt";
open (dataf,">>$datafile");
flock(dataf,2);
・
・
・
print dataf "〜$aaa,$bbb,$ccc〜\n";
・
・
・
close (dataf);
というスクリプトを作りました。(abc.cgiとします)
このスクリプトを実行させる際に、modeにabcdeを与え、
テキストファイルに「abcde,123,456」と書かせたいのですが、
http://www.hogehoge.com/abc.cgi?mode=abcde
という呼び出し方じゃダメなのでしょうか?
どうしても「,123,456」と書かれてしまうんです。
どこがいけないのでしょう?
0833nobodyさん
03/03/13 21:54ID:???フォームのデータをエンコして%FORMに入れる処理(またはそれに相当する
サブルーチン等の呼び出し)はもちろんやってるよね?
0834833
03/03/13 21:55ID:???逝け>俺
0836nobodyさん
03/03/13 22:05ID:???みんなはこれで満足してますか?
特に、何かの要素の値(?) <a href="(ここ)"></a>に何かを入れるとき、テンプレート
が、ちゃんとしたHTMLじゃなくなるのが痛い。
で、CGI::FastTemplateっていうかっこいいやつを発見したんだけど、使ってる人はいますか?
0838832
03/03/13 22:57ID:???デコードもやってないし、$FORM{'mode'}にも値を代入してないという、
初歩的な問題でした。
お騒がせしました。
0839nobodyさん
03/03/13 23:48ID:???亀ですが漏れはこうやってます
最後の出力のときに使って
open TMPL, "<$file";
while(<TMPL>){
s/\$([_\w]+)/${$1}/eg;
(HTMLエンコード処理)
print;
}
close TMPL;
0840nobodyさん
03/03/14 01:12ID:???使ってみたけど、ちょっと扱いづらいね。
単機能化されているみたいだから、
HTML::Templateより速くなるみたいだけど。
0841nobodyさん
03/03/14 02:29ID:???かなりの時間がかかってしまいます。
通常、実装するとしたらこれで大丈夫なのでしょうか?
my @port = ( 80, 8000, 8080, 8888 );
my $remote = $ENV{"REMOTE_ADDR"};
my $iaddr = inet_aton($remote)or die "Unknown host : $remote";
my $proto = getprotobyname('tcp');
socket (SOCK, AF_INET, SOCK_STREAM, $proto) or return 0;
foreach my $port ( @port )
{
my $paddr = sockaddr_in($port, $iaddr) or return 0;
if (connect(SOCK, $paddr))
{
return 1;
}
}
return 0;
0843nobodyさん
03/03/14 12:10ID:???バッククウォートで
`コマンド $xxx`
↑このようにやると危険なので
system "コマンド","引数"
↑こんな感じでやりたいのですが
systemを使ってリスト@_に格納する事はできないんでしょうか。
できないのであればどういう方法が一番bestでしょう?
汚染チェックはやりますが、少しでも危険な要素を取り除きたいので・・。
0844nobodyさん
03/03/14 12:27ID:???system関数だけでは無理だと思う。
俺ならシェルスクリプトを作るかな。
で、必要な引数のほかにファイル名を引数にとって
そのファイルに全てを出力させる。
perl側からは、systemで呼んだ後にそのファイルを
読みに行けばいい。
windows環境ならバッチファイルでもいいかと。
0845nobodyさん
03/03/14 15:26ID:???汚染チェックをしっかりやっていれば
open FOO, join(' ', $cmd, @arg, '|') or error;
@_ = <FOO>;
でいい気がする。
0846nobodyさん
03/03/14 15:48ID:???0847nobodyさん
03/03/14 17:19ID:???厨房質問なのですが、
main.cgiがあり、使用するライブラリが複数ある。
とうぜん「require」を書いてあるのはmain.cgi。
この時、ライブラリAから直接ライブラリBに含まれるサブルーチンに飛ばしてなんら問題ないんでしょうか?
なんか作ってて微妙に怖くなってきました。
とある解説サイトでライブラリとはCGIにサブルーチンが埋め込まれたのと全く同じ動きをするって書いてあったけど本当でしょうか?
メインファイルを直接経由しないライブラリ間でのやり取りって支障ないですよね?
0848843
03/03/14 20:31ID:???ありがとうございます。
ファイルに吐くのも考えましたがいちいちやっていたら大変なので・・。
汚染チェックだけに頼るのが一般的なんですかね?
perl始めて数週間なのでいまいち常識がわからなくて・・
0849nobodyさん
03/03/14 20:57ID:???open(FOO, "-|") or exec 'command', $param;
print <FOO>; # 何か処理
close(FOO);
perldoc perlsec参照。
Perlクックブックレシピ19.6に詳しい方法が載ってます。
0850nobodyさん
03/03/14 21:00ID:???これが常識
$pid = open(PIPE, '-|');
die unless(defined($pid));
if ($pid) {
local $/ = '';
@_=<PIPE>;
} elsif ($pid) {
exec 'command', 'arg';
}
0852850
03/03/14 21:47ID:???>>848
これが常識
$pid = open(PIPE, '-|');
die unless(defined($pid));
if ($pid) {
local $/ = '';
@_=<PIPE>;
} else {
exec 'command', 'arg';
}
0853nobodyさん
03/03/14 22:21ID:???# X,Y,Zは数字。Xには0〜3、Yには0〜4、Zには0〜3が入ります。
という文字列を
S● B●●●● O●●
# ●の数はそれぞれX,Y,Zの数値。0の場合は●はなし。
に変換したいのですが
$test = "[c222]";
if ( $test =~ m/\[c([0-3])([0-4])([0-3])\]/i ){
$count ="S"."●" x $1." B"."●" x $2." O"."●" x $3;
$test =~ s/\[c([0-3])([0-4])([0-3])\]/$count/i;
}
ない知恵絞って上記のようなものを書いて見ました。
もっとよい方法がありましたら教えてください。
あと $test に [cXYZ] が複数あった場合、すべて変換にするには
if の代わりに while を使う方法になりますか?
0854nobodyさん
03/03/14 22:34ID:???0855853
03/03/14 22:46ID:???漏れは何をまわりくどいことをやってたんだ。
s/\[c([0-3])([0-4])([0-3])\]/S●x$1 B●x$2 O●x$3/
最初こんな感じでやってみて無理だったので、上のになりました(^^;
勉強になりました。ありがとうございます。
0856841
03/03/15 00:24ID:???こちらのスクリプトを改造したのですが、一応
オープンとクローズは遅いながらも判別できました。
#!/usr/local/bin/perl -w
use strict;
use sigtrap;
use Socket;
my ($remote, $port, $iaddr, $paddr, $proto);
$remote = $ARGV[0] || "127.0.0.1";
$port = $ARGV[1] || 0;
print "REMOTE : $remote\n";
print "PORT : $port\n";
$iaddr = inet_aton($remote)or die "Unknown host : $remote";
$proto = getprotobyname('tcp');
socket (SOCK, AF_INET, SOCK_STREAM, $proto) or die "socket : $!";
while ($port < 65536) {
$paddr = sockaddr_in($port, $iaddr) or die "$!";
if (connect(SOCK, $paddr)) {
print "PORT : $port OPEN\n";
socket (SOCK, AF_INET, SOCK_STREAM, $proto)or die "socket: $!";
}
else {
print "PORT : $port CLOSE\n";
}
$port++;
}
0857nobodyさん
03/03/15 00:57ID:???>my $remote = $ENV{"REMOTE_ADDR"};
>my $iaddr = inet_aton($remote)or die "Unknown host : $remote";
inet_atonはホスト名をIPアドレスに変換でしょ。
無意味な正引きするより$ENV{"REMOTE_ADDR"}をpackしたほうが
早いんじゃないの?
0858nobodyさん
03/03/15 01:04ID:???しかも65536って、あーた。
0859nobodyさん
03/03/15 01:34ID:???pooアプレットの方は問題なく動いたのですが、しぃアプレットの方は
画像が2重に投稿され投稿失敗のメッセージが表示されてしまいました。
それまで普通のcgi-binフォルダではどちらも正常に動作していたので
多分ページに挿入される広告が悪さをしてるんじゃないかとは思うんですが
どう直せばいいのか私にはサッパリわかりません。
どなたかわかる人がいたら教えてください。お願いします。
ちなみに今まではこのスクリプトを使わせてもらってました。
ttp://mrdc.hp.infoseek.co.jp/compati.zip
0860859
03/03/15 01:40ID:3fqyLgHG今ダウンロードできるバージョンはもうpooをサポートしてないので、、
0861841,856
03/03/15 01:41ID:???確かにその通りでした。削っているうちにちんぷんかんぷんになっていたようです。
有難うございました。
>>858
アホな目的に使うつもりはないので65536はさすがにやっていません(^^;
0862nobodyさん
03/03/15 02:22ID:???依然として非常に遅いのですが、2chなどのプロキシ弾きはCでこのようにやっているものなのでしょうか?
my @port = ( 8000, 8080, 8888 );
$ENV{"REMOTE_ADDR"} =~ /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/;
my $iaddr = pack("C4", $1, $2, $3, $4);
my $proto = getprotobyname('tcp');
socket(SOCK, AF_INET, SOCK_STREAM, $proto) or return 0;
foreach my $port ( @port )
{
my $paddr = sockaddr_in($port, $iaddr) or return 0;
return 1 if(connect(SOCK, $paddr));
}
return 0;
0863nobodyさん
03/03/15 02:28ID:???0864nobodyさん
03/03/15 02:29ID:???0865Name_Not_Found
03/03/15 04:55ID:???http://www.kent-web.com/bbs/fantasy.html?
に、”タイトル”を入力する項目を追加したいのですが
いざやってみたら、上手くいきませんでした。
この場合、どこをどういじればいいのでしょうか?
0867nobodyさん
03/03/15 09:19ID:Uli+0qKe/cgi-binではhtml、jpgを閲覧できません。
現在のフォルダ
/www/
html/
cgi-bin/
これを/www/html/ 配下すべてでperlもhtmlも動作できるようにしたいのですが、
どうすればいいんでしょうか?
0868nobodyさん
03/03/15 10:23ID:???apacheの設定を弄るか.htaccessで設定を変更する必要があるのだが権限あるの?
キーワードはScriptAlias,ExecCGI。
スレ違いになるので後は自分で調べてください
0870nobodyさん
03/03/15 10:27ID:Uli+0qKeスレ違いですか。
http://x68000.startshop.co.jp/~68user/webcgi/server-config.html
の通り、
httpd.confを弄ってみたんですが、うまくいかなかったんで。
当然root権限はあります
0871nobodyさん
03/03/15 10:36ID:???のコメントは外した?
ドキュメントルートを移動させてれば、そっちもOptionsの設定がいるよ。
つか、サーバルートの設定を変えるってのはヤバイ。
これ以上はすれ(略。
0872867
03/03/15 10:55ID:???もっと勉強が必要か。
CGI設置フォルダの下にhtmlを置くやつが使いたかったから・・・。
0873nobodyさん
03/03/15 12:12ID:???>当然root権限はあります
こんなやつがroot権限を持つなんて・・・、しかも当然だって・・・(w
0874867
03/03/15 12:35ID:???となりのPC(ry
root権限なかったら、こういう質問しませんよ。
共用なら、たいていどこの階層でもperl使えるし、
cgi-bin限定でもhtmlや画像、映像も置ける。
ISPのサーバーなら、できないならできないと初めから書いてるしね。
ま、踏み台にされないように頑張りますw
0875867
03/03/15 12:37ID:???0876nobodyさん
03/03/15 12:40ID:???っていっても期待はできないな。気持ちで防げるものではないから。あはは・・
0877867
03/03/15 13:55ID:???そんなに難しいことじゃなかったらしい。
876にバカにされるのもいさ仕方ないのかも。
サーバーの電源落として寝ますわ。
0878nobodyさん
03/03/15 14:07ID:???0879nobodyさん
03/03/15 17:45ID:5hlN9xGBこのような処理で万が一タイムアウトになった場合、次の処理に移り
たいのですが、実行しっぱなしになってしまいます。
通常どういった処理を行うのが良いのでしょうか。
0880nobodyさん
03/03/15 17:51ID:???ありがとうございました。
ただ私の環境はActivePerl-5.6.1.635なので
どうもできないようです。(forkできないから?)
execも引数を2個使うとなぜか機能しません。
○exec "コマンド 引数"
×exec "コマンド","引数"
もうさっぱりわかりません。
open FOO,"コマンド 引数|"
これだとFOOに結果が格納されたんですが
引数が外部の場合危ないですよね。
0881nobodyさん
03/03/15 18:45ID:???漏れって「引数」をずっと「いんすう」って読んでたよ。
0882845
03/03/15 19:28ID:???alarmでどうよ。
>>880
> 引数が外部の場合危ないですよね。
だから「チェックをしっかり」と書いてるんだけど…。
"$cmd $arg"と書かずに$cmd,@argと書いた意図を汲んでほしいな。
そもそも使いたいコマンドは何?引数はそんなに複雑なの?
引数が2つ以上のexecは引数が1つの時と挙動が変わるし、
第一システムコール使う関数は9x系とNT系で実装具合が違う。
駱駝本なりperldoc -f execなり読んでね。
0883nobodyさん
03/03/15 20:20ID:???私も昔そう呼んでたよ。気にするな。
0885nobodyさん
03/03/15 21:18ID:???汚染チェックだけしっかりやっとけ
>>882
$cmd,@argでも' 'でjoinしている時点で
意図を汲みようがないと思われ
0886nobodyさん
03/03/15 21:42ID:???$SIG{'ALRM'} = sub{ die 'timeout' };
eval{
alarm($timeout); # $timeout秒
$tmp = `/usr/bin/whois -h $server $name.$domain |grep -i '$msg'`;
alarm(0);
};
if ($@){
alarm(0);
($@ =~ /timeout/) or die;
# timeout!
}
# windowsではalarmが使えません。
>>880
windowsでは "-|"が使えません。
0887nobodyさん
03/03/15 22:26ID:5hlN9xGBどうもありがとうございます。
うまくいきました!
0888nobodyさん
03/03/16 04:48ID:???文字列いれてやればいいんだけどPOSTはどうやればいいですか?
途中まで書いて調べてみたんだけど。
$ENV{'SCRIPT_NAME'}="/cgi-bin/test.cgi";
$ENV{'REQUEST_METHOD'}="POST";
$ENV{'CONTENT_LENGTH'}="24";
open FH,"-l", or exec "perl","test2.cgi";
0889Name_Not_Found
03/03/16 05:06ID:???LWP(libwww)使うと幸せになれるかと。
0891890
03/03/16 11:19ID:???できました。ありがとうございます。
一応こんな風になりました。ってコピペですが。
use HTTP::Request::Common qw(POST);
use LWP::UserAgent;
$ua = LWP::UserAgent->new;
my $req = POST 'http://www.xxx/yyy.cgi',
[ namae => "bbb",
name2 => "aaaa" ];
@aaa= split ( /<BR>/,$ua->request($req)->as_string);
0892nobodyさん
03/03/16 13:18ID:???0893nobodyさん
03/03/16 20:10ID:HMSF0mo0$trip = 1;
#トリップ変換文字列
$tripsalt = XX;
#---------------------#
# トリップ #
#---------------------#
sub tripping {
if ($trip == 0) {
}
if ($trip == 1) {
# トリップ機能有効なら◆は◇に置き換える
$name =~ s/◆/◇/;
if ($name =~ /(#|#)(.*)$/) {
$string = crypt("$2", $tripsalt);
$tripstr = substr($string,2,8);
$name =~ s/(#|#)(.*)$/◆$tripstr/;
}
}
掲示板にトリップ機能を付けようと思っています。
上の設定でon/offを切り替えれるように設定しようと思っているのですが、
これでいいのでしょうか?
0895893
03/03/16 20:15ID:HMSF0mo0動いてくれませんでした。
有効にしたはずだけど無効でした。
0896nobodyさん
03/03/16 20:15ID:MtdvS7v9「あほ」 が含まれてるだとか、判断したいんです。
0897nobodyさん
03/03/16 20:18ID:???どう動かなかったのか?
$tripsalt = XX;
一応クオートで囲って下さいな。
if ($trip == 0) {
}
いらないです。
後、スコープという物をもうちょっと意識した方が良いかと思います。
0898893
03/03/16 20:28ID:HMSF0mo0レスありがとうございます。
動かなかったというのは無効設定というか、
加える前と何も変わりませんでした。
on off機能を無くしてスクリプトに直接埋め込んだ(こういう表現で良いのでしょうか?)
場合、有効になりました。
>>$tripsalt = XX;
>>一応クオートで囲って下さいな。
これですが直接埋め込んだときは囲わなくて動いたので大丈夫だったのですが、
やはり囲った方がいいのでしょうか?
直接埋め込んだときは書き込み処理の前に
$name =~ s/◆/◇/;
if ($name =~ /(#|#)(.*)$/) {
$string = crypt("$2", $tripsalt);
$tripstr = substr($string,2,8);
$name =~ s/(#|#)(.*)$/◆$tripstr/;
}
を埋め込みました。
まだクッキー部分の始末もしないといけないし、まだまだ時間がかかりそうです。
0899nobodyさん
03/03/16 21:48ID:???HTMLじゃないんだから、文字列のクオートは省略しちゃいかんよ。
「文字列ではない何か」とみなされることがある。
プログラムの別の場所で$tripという変数を使ってたりしない?
>>897の言う「スコープ」を意識しないと、こういう単純ミスをしがちなので。
0901893
03/03/16 22:10ID:HMSF0mo0レスありがとうございます。
試行錯誤でなんとか出来ました。
あとはクッキーにトリップ変換後の物が記録されるのを修正です。
Perlは最近自分で勉強しだしたので、スコープが何か全く分かりません。
勉強してきます。
レス付けてくださった方ありがとうございました。
0902nobodyさん
03/03/16 22:18ID:???0903nobodyさん
03/03/16 22:24ID:04Nbdlpl今、試験的に2008年、2ちゃんねるUNIX板で開発された『タイムアクセス』を使って
2003年3月16日の「2ちゃんねる」に書き込んでいます。
2008年から(´∀` )オマエモナー
http://comic2.2ch.net/test/read.cgi/ymag/1047479574/
0904nobodyさん
03/03/16 22:40ID:WBb98oow↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
http://www.pink-angel.jp/betu/linkvp2/linkvp.html
0905nobodyさん
03/03/16 22:57ID:???川o・-・)ノ <先生!こんなのがありました!
__/ / /
\(_ノ ̄ ̄ ̄\
||ヽ|| ̄ ̄ ̄ ̄||
...|| ̄ ̄ ̄ ̄||
http://saitama.gasuki.com/shinagawa/
0906nobodyさん
03/03/17 06:24ID:???while (<FH>) {
だと 内容が $_ に格納されますが
}
foreach my $x (@x) {
のように、初期で変数に格納する方法はないでしょうか?
}
説明がへたくそですみません・・。
while (<FH>) {
$x=$_;
とするしかないのでしょうか・・
}
0908nobodyさん
03/03/17 07:35ID:???有難うございますー
一度、($x = <FH>) でやったところエラーが出たので
出来ないのかと思い込んでいたら、 myが抜けていたのですね・・。Strictで書いていたもので;
これで次に進めそうです(^^
レス数が900を超えています。1000を超えると表示できなくなるよ。