【Perl】初心者コーナー Part18
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001nobodyさん
02/11/20 22:04ID:???1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
CGIだけど、なんか質問ある? Part 8
http://pc.2ch.net/test/read.cgi/php/1032704121/
参考書籍の話題は【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あたりを見よう。
0875869
03/01/06 01:52ID:???その本のプログラムはPerl4で書かれていたからmyは使ってなかった。
localも何故かほとんど使ってなくて、
$hogeや@hogeみたいな変数は全てグローバル変数だった。
0878nobodyさん
03/01/06 21:42ID:???アクセスがあるとHTTPの文書を返せればよいのですけれど
0882864
03/01/07 01:48ID:???調べたら簡単に出来るモジュールがあった。
http://search.cpan.org/author/GAAS/libwww-perl-5.68/lib/HTTP/Daemon.pm
そのまんまだ、
サンプルをいじって見れば、、、
0883864 2/3
03/01/07 01:49ID:???----httpd.plとして作成
use HTTP::Daemon;
use HTTP::Status;
my $d = new HTTP::Daemon(LocalPort =>$ARGV[0]) || die;
print "Please contact me at: <URL:", $d->url, ">\n";
while (my $c = $d->accept) {
my ($family, $port, $heraddr) =unpack('S n a4 x8',$c->peername);
while (my $r = $c->get_request) {
print "Accept from:".Socket::inet_ntoa($heraddr)." Port:".$port."\n";
print " User-Agent:".$$r{"_headers"}{"user-agent"}."\n";
if ($r->method eq 'GET' and (-e '.'.$r->url->path)) {
if ($c->send_file_response('.'.$r->url->path)) {
print "Get file: .".$r->url->path."\n" ;
}
} else {
print "Not Respons ".$r->method." ".$r->url->path."\n" ;
$c->send_error(RC_FORBIDDEN)
}
}
print "Close Connection :".Socket::inet_ntoa($heraddr)."\n";
$c->close;
undef($c);
}
----
0884864 3/3
03/01/07 01:50ID:???試しとして同じDIR上にaaaa.htmlを作成
perl httpd.pl 8888 で起動。8888は任意のポート番号
ブラウザからhttp://ホスト名/aaaa.html で表示を確認した。
しかし、これだけだとマルチスレッドとならない為完全な同時アクセスには対応していない。
(先のページには同時に5要求の待ち合わせが出来るように書いてある?)
以上
0885864
03/01/07 01:57ID:???ブラウザからhttp://ホスト名/aaaa.html で表示を確認した。
↓
ブラウザからhttp://ホスト名:8888/aaaa.html で表示を確認した。
0886nobodyさん
03/01/07 03:26ID:???use HTTP::Daemon;
use HTTP::Status;
my $d = new HTTP::Daemon(LocalPort =>$ARGV[0]) || die;
print "Please contact me at: <URL:", $d->url, ">\n";
while (my $c = $d->accept) {
my ($family, $port, $heraddr) =unpack('S n a4 x8',$c->peername);
while (my $r = $c->get_request) {
print "Accept from:".Socket::inet_ntoa($heraddr)." Port:".$port."\n";
print " User-Agent:".$$r{"_headers"}{"user-agent"}."\n";
if ($r->method eq 'GET' and (-e '.'.$r->url->path)) {
if ($c->send_file_response('.'.$r->url->path)) {
print "Get file: .".$r->url->path."\n" ;
}
} else {
print "Not Respons ".$r->method." ".$r->url->path."\n" ;
$c->send_error(RC_FORBIDDEN)
}
}
print "Close Connection :".Socket::inet_ntoa($heraddr)."\n";
$c->close;
undef($c);
}
0887nobodyさん
03/01/07 03:31ID:???use HTTP::Daemon;
use HTTP::Status;
my $d = new HTTP::Daemon(LocalPort =>$ARGV[0]) || die;
print "Please contact me at: <URL:", $d->url, ">\n";
while (my $c = $d->accept) {
my ($family, $port, $heraddr) =unpack('S n a4 x8',$c->peername);
my $pid = fork() ;
if ($pid!=0) {
next ;
}
else {
while (my $r = $c->get_request) {
print "Accept from:".Socket::inet_ntoa($heraddr)." Port:".$port."\n";
print " User-Agent:".$$r{"_headers"}{"user-agent"}."\n";
if ($r->method eq 'GET' and (-e '.'.$r->url->path)) {
if ($c->send_file_response('.'.$r->url->path)) {
print "Get file: .".$r->url->path."\n" ;
}
} else {
print "Not Respons ".$r->method." ".$r->url->path."\n" ;
$c->send_error(RC_FORBIDDEN);
}
}
print "Close Connection :".Socket::inet_ntoa($heraddr)."\n";
$c->close;
undef($c);
}
}
0888nobodyさん
03/01/07 14:19ID:???リファレンスとかバリバリ使ってる初心者は嫌だ。
0889nobodyさん
03/01/07 15:42ID:???一度立った事があるけど、今は残ってない。
初心者と中級者の線引きを決めないと上手くいかないよ。
tu-ka,中級者は自分で調べる事(自力で解決する術)を知ってるから、
あまりこういうところで聞かないんだよな。
0890nobodyさん
03/01/07 23:25ID:???どんどん質問してください。
当然、
1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ。
0891nobodyさん
03/01/08 00:41ID:???if ($fname =~ /filename="(.*)"/){
my $tmp = $1;
if ($tmp =~ /\\/){
for ($fi = (length $tmp) - 1; $fi >= 0; $fi--){
if ("\\" eq substr($tmp, $fi, 1)){
$fi++;
last;
}
}
$fname = substr($tmp, $fi);
}else{
$fname = $tmp;
}
}else{
$fname="";
}
Windowsから十二名の乗客.jpgを取得しようとすると
二名の乗客.jpgとなってしまいます。
どなたか良い方法をご教授ください。
0892nobodyさん
03/01/08 03:07ID:???文字コードをECU-JPにしてその後SJISに戻すとか…
ちなみに処理は1行で
$fname =~ m/([^\\]*)"$/;
print $1;
0894えり
03/01/08 10:27ID:RjcWJJ7/アンインストールしたいのですがどうすればいいですか?
アプリケーションの追加と削除で削除したのですがperlのフォルダーが残っており
又、フォルダーの中身ものこったままです
0896nobodyさん
03/01/08 13:03ID:3CJ1U7Ioたとえば、
テキストファイルに「青」、「うんこ」とあったら
perlで五十音順に並べ替えたりできるんですか?
0898896
03/01/08 14:05ID:???少なくとも読み仮名が無ければ厳しいんですね。
http://www.mytools.net/cgitools/dictionary0.html
こういうの見つけましたが、構成ファイルが多すぎてセッティングしてません。
0900えり
03/01/08 15:39ID:RjcWJJ7/ありがとうございました!!!
0901nobodyさん
03/01/08 20:51ID:OEI4EUTrkakasiを使えば、ある程度は、正しい読み仮名を付けれるよ。
0902nodody
03/01/08 22:13ID:1Pe5J1+Nしてみたいと思っています(スキルアップのために)。
ソースの見やすさを考える以外に気をつけておいた方がいいことが
あればご教授下さい。
Perlを使用します。
(特定の記述法は特に効率が悪いからやめろとか)
0905nobodyさん
03/01/08 22:24ID:???ローカルでテストする。
これ、最優先事項。
0906nodody
03/01/08 22:26ID:1Pe5J1+Nマジで見てくださるのですか!?
じゃあ、マッハでつくります。
>>904
ありがとうございます。
気をつけてみます。
0908nobodyさん
03/01/08 22:30ID:atnjxi5O参考書に載ってなかった。おしえてくだちい。
0909nobodyさん
03/01/08 22:32ID:???0910nobodyさん
03/01/08 22:32ID:???0911nobodyさん
03/01/08 22:53ID:???0913nodody
03/01/08 23:15ID:1Pe5J1+Nいや、少なくとも数日かかると思いますが…。
意気込みってやつですよ。
>>907
use strict と-w 調べて使ってみました。
out という名前でファイルを開いたあと、
print out "文章";
と書くとoutがクォートで囲まれていないという警告が出ます。
そこで
print "out" "文章";
とするとエラーがでて動作しません。
これは無視した方がいいのでしょうか?
0914913
03/01/08 23:18ID:1Pe5J1+NError 500
CGI エラー - Content-Type ヘッダが正しくありません。
というエラーです。
0916nobodyさん
03/01/08 23:40ID:???正直、様々な原因が考えられるエラーだ。
本気でデバッグしてもらいたいなら、
スクリプトをどっかに.txtにしてアップするくらいのことはしろ。
0918>>916
03/01/09 00:39ID:ve0CCzFGにソース(すごく簡略化してありますが、エラーメッセージは同じです)
とエラーメッセージをテキストにまとめてアップしました。
よろしければご教授下さい。
0919nobodyさん
03/01/09 00:56ID:???open OUT, ">test.dat";
print OUT $text;
close (OUT);
open IN ,"<test.dat";
my @a = <IN>;
close (IN);
0920913
03/01/09 01:01ID:ve0CCzFGありがとうございました。
0921nobodyさん
03/01/09 01:07ID:???これと比べてみな。
#!/usr/local/bin/perl -w
use strict;
my $text = <<'EOE';
テスト
です
EOE
open ( OUT, '>test.dat' );
print OUT $text;
close ( OUT );
open ( IN, 'test.dat' );
my @line = <IN>;
close ( OUT );
print "Content-type: text/html\n\n";
print "<html><head><title>test</title></head><body>";
print map { $_,'<br>' } @line;
print "</body></html>";
exit;
0922nobodyさん
03/01/09 01:13ID:???Perlの文法がどうこう以前に、
変数の名前のつけ方とかをもっとしっかりさせた方がいい。
http://www.rfs.jp/sitebuilder/perl/07/01.html
http://www.rfs.jp/sitebuilder/perl/07/02.html
こんなのでも読むべし。
0923nobodyさん
03/01/09 02:51ID:j8Nogs/Uime.nu/hoge.jp/だったらime.nuのあとにhoge.jp/というフォルダを作っているんですか?
それとhttp://ime.nu/test.com/
からtest.comをどうやって取得しているんですか?
リファは無理っぽいです。
0924nobodyさん
03/01/09 03:55ID:???#!/usr/bin/perl
use strict;
my $buf_size = 256;
my $query = substr $ENV{PATH_INFO}?$ENV{PATH_INFO}:$ENV{QUERY_STRING},0,$buf_size;
$query =~ tr{-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#}{}cd;
$query =~ s{^/+}{};
print <<HTML;
Content-type: text/html;charset=Shift_JIS\r\n\r
<html><head><title>jump</title></head><b><a href=${query}>${query}</a></b><br>
別のサイトにジャンプしようとしています。宜しければ上記のリンクをクリックしてください
HTML
__END__
0926nobodyさん
03/01/09 09:35ID:???以前実験したことがありますが、IE6では約2000bytes、Netscape7では約8000bytes送れました。
ネスケでは、Apacheから
400 Bad Request
Your browser sent a request that this server could not understand.
Size of a request header field exceeds server limit.
とか
414 Request-URI Too Large
The requested URL's length exceeds the capacity limit for this server.
request failed: URI too long
とか言われますた。
0927nobodyさん
03/01/09 10:32ID:???できますか?教えてください。
0928nobodyさん
03/01/09 10:57ID:???0930初心者
03/01/09 13:46ID:???cgiページの最上部にサイト共通のヘッダを表示したかったので
<!--#include file="header.html"-->
と記載しましたが、そのままコメント文として出力されました。
この場合はどんな方法を使用すればよいのでしょうか?
0931nobodyさん
03/01/09 13:59ID:???Perlとは一切関係ないので該当スレへ行ってください。
SSIスレとかかな?
Apacheの設定スレの方がいいかな?
どのスレへ行けばいいかわからないからと言って、マルチポストはするんじゃないぞ。
0932nobodyさん
03/01/09 14:11ID:???open(IN, "<header.html");
my @header = <IN>;
close(IN);
<!--#include file="header.html"-->
の代りに
@header
とでもしておけYO
0937nobodyさん
03/01/09 15:33ID:???Perlで排他制御を行うにはシンボリックリンクをフラグとして使いましょう。
とかまじめに書いてるサイトもあるので要注意だな。
0938nobodyさん
03/01/09 15:53ID:???マルチタスクでの排他処理は要注意。
0939nobodyさん
03/01/09 16:21ID:???http://www.hoge.co.jp/hoge.cgi?str=あいうえお
こんな風に日本語を引数にしてもいいんでしょうか。
試したらうまくいったんですけど。
なんか、検索エンジンとかでは、入力するとurlエンコードって言うんですかね、
そうなって訳のわからない文字に変換されますよね。
ああいう風にしなくてもいいんですかね、という事です。
0940nobodyさん
03/01/09 16:51ID:???良し悪しで言えば・・・悪し。
フォームでGET送信すれば自動的にエンコードしてくれるけど
直リンでの固有文字はその文字コードを使用していないと文字化けまくり。
しかも文字中に&や=などの区切り文字など混じった場合に対処出来なくなる罠。。
World Wideを意識しないでローカル派なのであればどうぞ。
0941nobodyさん
03/01/09 17:15ID:???もちろん必須です。理由はRFCで決まっているから。で良いと思われ。
特定のアルファベットと記号以外を全部%16進の形式にするだけなので割と簡単です。
formのinput要素とかはブラウザが変換する義務を負うので無視して良いです。
0942nobodyさん
03/01/09 17:18ID:???なぁ?
URLエンコードしてもそのエンコード前の文字コードに対応してなかったら結局化けると思うんだけれど。
あなた論理だと英語以外送っちゃいけないことに・・・。
SJIS -URLエンコード-> URLエンコードされたSJIS -URLデコード-> SJIS
0943nobodyさん
03/01/09 17:35ID:???現状ではまだ英数文字以外のURLは送るべきではない。
http://www.hoge.co.jp/hoge.cgi?str=あいうえお
書かれていたこのURLはただの例にすぎないが
URLを伝える過程(Webだけではなく)で文字化けしていては
第三者がURLを辿っていけない状況は多分にある。
そのURL先が文字化けしているか、はまた別の話。
0944nobodyさん
03/01/09 17:46ID:???「改行が2つ続いたら、それは改行1個に置き換える」をしたいんですが、
$value =~ s/\r\n\r\n|\r\r|\n\n/\n/g;
これじゃダメっぽいです。なぜでしょうか。
0946nobodyさん
03/01/09 18:00ID:???改行とおぼしきものを一旦違うものに置き換えてからってどうかしらん?
$value ~= s/\r\n|\r|\n/<br>/g;
$value ~= s/(<br>)+/$1/g;
とか。
他の凡例は >>946
0951nobodyさん
03/01/09 18:43ID:???s/\n\n+/\n/g;
0952nobodyさん
03/01/09 18:58ID:???0953nobodyさん
03/01/09 19:02ID:???1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
0956nobodyさん
03/01/09 19:51ID:???0959nobodyさん
03/01/09 20:38ID:???http://tohoho.wakusei.ne.jp/wwwgif.htm#AnimatedGIF
0961nobodyさん
03/01/09 21:27ID:???どのようにすればいいんでしょうか?
0963nobodyさん
03/01/09 22:31ID:???0964nobodyさん
03/01/09 23:50ID:???(ループのさせ方)がありましたらお教え下さい。
−−−−−ここから−−−−−
#!/usr/bin/perl
for ($a=0; $a<9; $a++) {
for ($b=0; $b<9; $b++) {
for ($c=0; $c<9; $c++) {
for ($d=0; $d<9; $d++) {
for ($e=0; $e<9; $e++) {
for ($f=0; $f<9; $f++) {
for ($g=0; $g<9; $g++) {
for ($h=0; $h<9; $h++) {
for ($i=0; $i<9; $i++) {
for ($j=0; $j<9; $j++) {
$k = $a . $b . $c . $d . $e . $f . $g . $h . $i . $j;
}
}
}
}
}
}
}
}
}
}
−−−−−ここまで−−−−−
0968nobodyさん
03/01/10 00:18ID:???>>962は、「monaを含む要素」の数
>>963は、「monaそのものである要素」の数
この場合質問が複数の解釈を許すからこういうことが起こる。
質問をする方にも、質問をするスキルが求められていると言うことだな。
0969nobodyさん
03/01/10 02:37ID:bsKAU3F+にはどうしたらいいのですか?
`pwd`で得ようとしましたが、そのスクリプトを起動したパスになってしまいます。
どうかお願いします。
0971えせカミ
03/01/10 04:30ID:???例えば)
movf bittimc,w ;1bitタイマカウンタをwに格納し
addlw 2 ;+2
movwf bittimcb ;した値を控えに格納。
といったASM言語の各命令を1関数として
movfについて
sub movf ($$) {
my $freg = shift;
my $fw = shift ;
$REG::W = &LOADF($freg);
}
と定義したとして
movf bittimc,w ;
のbittimc と wが引数として評価されて当然エラーとなります。
この関数への引数を評価無しで関数にその文字を渡すような事を出来ないでしょうか?
’’で囲って文字列として指定すれば良いのですが極力実際のASMコーディングを生かしたいと、、
わがままですね。。。
0972
03/01/10 08:40ID:1IvfvcLause File::Basename;
use Cwd 'abs_path';
my ($name,$path,$suffix) = fileparse($0);
my $abs_path = abs_path($path);
print "($name,$path,$suffix),$abs_path\n";
0973nobodyさん
03/01/10 08:41ID:0QU3xkA6$0 : 実行している perl スクリプトのファイル名。
$0 に代入を行なうと、ps(1) プログラムが参照する引数領域を変更する。
覚え方:
sh や ksh と同じ。
ttp://www.cec.co.jp/usr/hasegawa/Docs/perl-jman/perl-4.019/perl_169.html#SEC234
0974nobodyさん
03/01/10 10:03ID:???今は普通に手書きの
if($ENV{ 'REQUEST_METHOD' } eq "POST"){
read(STDIN, $QUERY_DATA, $ENV{'CONTENT_LENGTH'});
}else{
$QUERY_DATA = $ENV{'QUERY_STRING'};
}
省略、
をやっています。初めて覚えた時このやり方だったんで。
CGI.pmといのを使うやり方もあるみたいなんですが
どっちでやった方がいいとかあるんでしょうか。
こっちの方が効率がいいとか、バグが無くなるとか。
プロトタイプを(**)にする。
そうすると裸のワードを受け付けるようになる。
…なんだけど、movf bittimc, w;としたときに
たとえばbittimcというサブルーチンが事前に宣言されていたり、
予約語だったりするとうまくいかないので注意してね。
他は、使用するシンボルを全て
use constant symbol => 'symbol';
として定数としておくという手もあるかな。
レス数が950を超えています。1000を超えると書き込みができなくなります。