【Perl】初心者コーナーPart10
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
02/02/24 22:18ID:zOj6Yq/31:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ、良い回答は良い質問から。
一緒に勉強しましょう。
参考書籍はこちら【【Perl,CGI】参考書籍 第2版 】
http://pc.2ch.net/test/read.cgi/php/988809842/
CGIの質問はこちら【CGIだけど、なんか質問ある?part5】
http://pc.2ch.net/test/read.cgi/php/1009331505/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/
過去ログ、その他の役立ち情報は>>2-10を見よう。
0466nobodyさん
02/03/13 04:27ID:???いや、単なる個人的意見ですが。
>>465
HTML::LinkExtor使うと簡単ですよ。
0467nobodyさん
02/03/13 04:32ID:???引数で指定されたディレクトリに移動して.をopendir
readdirを見ていき$_が
・ディレクトリなら再帰(引数は今見てる$_)
・HTMLファイルなら開いて痴漢してプリント
全部見終わったら..に移動
な関数を作る。でいいのでは?
465は自力でできそうな気がするのでわざとコードは書かない(w
0468nobodyさん
02/03/13 04:55ID:???foreach (@file) {
open FH, $_ or die $!;
while (<FH>) {
if (m{<a\s+href="(http://[^"]+\.co\.jp[^"]*)"}i) {
$1 =~ s/\.co\.jp/.ne.jp/g;
print "$1\n";
}
}
close FH;
}
--------------------
use IO::Dir;
use HTML::LinkExtor;
foreach (grep { /\.html$/i } IO::Dir->new(q/./)->read) {
my $parser = HTML::LinkExtor->new;
$parser->parse_file($_);
foreach my $elem ($parser->links) {
$elem->[0] eq q<a> or next;
while (@$elem) {
my ($attr, $value) = splice @$elem, 0, 2;
next unless $attr eq "href"
and $value =~ m{http://.+\.co\.jp/?}i;
$value =~ s/\.co\.jp/.ne.jp/g;
print $value, "\n";
}
}
}
双方とも動作確認無しですが。
0470470
02/03/13 08:13ID:DQ1JFad8以下のようにソートすると当然、文字コード順で愛知(アイチ)、
愛媛(アイヒメ)……という順番になります。([18]が住所です)
-----------------------------------------------------------
# 都道府県別にソート
if($sort == 3){
@LINES = sort { (split(/\,/,$a))[18] cmp (split(/\,/,$b))[18] } @LINES;
}
-----------------------------------------------------------
これを都道府県コード順にソートするにはどうしたらよろしい
でしょうか?
http://www2.odn.ne.jp/sasabomb/tables/jisx0401.html
もちろんCSVに都道府県コードは含まれていません。どなたか
ご教示よろしくおながいします。
0471nobodyさん
02/03/13 08:27ID:???47都道府県名をあなたが望む順番でリストに格納。
そのリストに従ってデータをソートするルーチンを書く。
愛媛も愛知も同じ愛である以上、一緒に並ぶのは当然。
0472ほい
02/03/13 09:55ID:68BwgqOIif($sort == 3){
$i = 0;
undef(%pref);
foreach $pref_name ('北海道','青森県','岩手県','宮城県','秋田県','山形県','福島県',
'茨城県','栃木県','群馬県','埼玉県','千葉県','東京都','神奈川県','新潟県','富山県',
'石川県','福井県','山梨県','長野県','岐阜県','静岡県','愛知県','三重県','滋賀県',
'京都府','大阪府','兵庫県','奈良県','和歌山県','鳥取県','島根県','岡山県','広島県'
,'山口県','徳島県','香川県','愛媛県','高知県','福岡県','佐賀県','長崎県','熊本県'
,'大分県','宮崎県','鹿児島県','沖縄県') {
$pref{$pref_name} = $i++;
}
@LINES = map {$_->[0]}
sort {$pref{$a->[18]} <=> $pref{$b->[18]}}
map {[$_, split /,/]} @LINES;
}
0473nobodyさん
02/03/13 10:29ID:auK7WJtB残ってますよね。
掲示板作ってるんですが書きこみ後リロードすると二重投稿になっちゃうんですよ。
どうやって回避するんでしょうか?
0474nobodyさん
02/03/13 10:36ID:???1:投稿内容を直前のものと比較して、一致したら書き込み拒否する。
2:書き込み後Locationで別のページ(そのBBSでも問題なし)に飛ばす。
0475473
02/03/13 10:46ID:auK7WJtBありがとうございます。
1:は考えたんですがプログラム的にカッコよくないかと思ったので・・・
2:でやってみます。
助かりました。
0476nobodyさん
02/03/13 10:50ID:???ただし、2の場合、投稿ボタン2度押しには対応できないという事を忘れずに。
1ならそれも防いでくれるけどね。
0477473
02/03/13 11:06ID:???ええ!?そうなんですか?じゃあやっぱり1でやりますね。
どうせソースなんか僕しかみませんしね。
あ、でも、連続して削除する時のチェックボックスなんかは
間違いでなく一致しちゃうこともありますよね。
そこらへんの実践的なテクニックって皆さんどうやって習得されてるんでしょうか?
Perlは独学の方も多いと思いますが・・・
(ちなみに僕は元COBOLプログラマです)
0478nobodyさん
02/03/13 13:28ID:???レンタル掲示板を自分でやろうとすると、
どうすればいいのでしょうか?
プログラムは1個で、設定ファイルを顧客分つくるのでしょうか?
また、自分が借りているティーカップでは、
アドレスの拡張子がhtml になっています。
これ、なんでhtml なんでしょうか?
レンタルの仕組みと関係あるんでしょうか?
0479nobodyさん
02/03/13 13:38ID:???もっと基本的なところから勉強しないと問題外。
具体的にはHTMLタグとかから。
0482nobodyさん
02/03/13 15:16ID:nYyCnnqMhttp://www.hoge.com/cgi-bin/foo.cgi
というCGIに対して、
http://www.hoge.com/cgi-bin/foo.cgi?http://www.bar.com/aaa/bbb.txt
という風にURLを渡して、
bbb.txtの内容を読みこんであれこれ処理したいんですが、
bbb.txtの内容を読みこむにはどうやればいいんですか?
何かモジュールを使うんでしょうか。
0486nobodyさん
02/03/13 15:38ID:???検索サイトって知ってる?
0487460
02/03/13 16:14ID:???ありがとう。
「バッファリングの防止」というものは知っていたんですが具体的に何をするものかがさっぱりでして・・・。なるほど。
例えは悪いですが,普段はコンパイラが(print構文を)食べて,ある程度たまってからウンコ(出力)するんですね。
しかし$_ = 1;を指定しておくと食べながらウンコするわけか。
そうかそうか。
0489レンタル掲示板
02/03/13 16:57ID:???それをレンタルする仕組みが知りたいんですが・・・
なんで、htmlかも知りたい。
0490nobodyさん
02/03/13 17:03ID:???まずはcgiのソースを読んで意味が理解できるようになれ。
そうすれば両方の答えが自然に出てくる。
perlの書き方も知らない人間には教えられないって。
数字を知らない人間に算数を教える事は出来ないだろう?
>>1-10くらいにはいいリンクも揃ってるんだしがんばって勉強してくれ。
0491レンタル掲示板
02/03/13 17:10ID:???0492nobodyさん
02/03/13 17:17ID:???HTMLソース見ろ。
0493レンタル掲示板
02/03/13 17:29ID:???4桁の数字がIDになっています。
ということは、
そのID専用のスクリプトを
ひとり1個ずつ
サーバーに置いているということでしょうか?
0494nobodyさん
02/03/13 18:48ID:???0496レンタル掲示板
02/03/13 19:55ID:???書いてあるページとかあるのかな?
0497レンタル掲示板
02/03/13 20:01ID:???0498449..450
02/03/13 20:42ID:???あ、ごめん。たしかにそうなりますね(^^;;
あと100点満点どうこうは、>>449のsprintfで%03d(3桁)
にしてるためだったのですが、>>450で訂正したようにすると、
その制限は無くなりますです。
0499春chu駆除係
02/03/13 20:51ID:???Hyper Text Markup Language だから、ふつー拡張子は .html だろ。
あんたは普段 .html じゃない拡張子でhtmlファイルを保存してんのか!?
0501nobodyさん
02/03/13 21:00ID:???MS-DOSは8.3形式。
あらゆるOSとの互換性を考慮するなら拡張子をhtmとしても何ら問題ではない。
それか、あんた世の中にはWindowsしか動いてないとか?w
だから平気でファイル名に%20(スペース)入れるバカが出てくるんだな。
0502460
02/03/13 21:05ID:???おれもマジレスしようかと思ってたがやめといてよかった。
ヒマな厨房が無理やり揚げ足とりのワナを張ってる気がしたんだよ。
0504460
02/03/13 21:46ID:???ただでさえ人の少ないWebProg板なのにJAPUや_GUNZIPなんかも揚げ足取られてどんどん出ていった・・・。
0509470
02/03/13 21:56ID:???すいません、難しくて理解できないんです。申し訳
ありませんが、もう少し易しくご教示いただければ
幸いです。よろしくお願いします。
>>472
ありがとうございます。その通りやってみましたが、
ソートされずにそのまま出力されてしまいました。
0510nobodyさん
02/03/13 21:56ID:???> HTML文書の拡張子は通常 .html なのですが、Windows 3.1など古いシステムでは拡張子に3文字までしか使用できなかったため、
> Windows系では未だに .html の代わりに .htm と記述するケースが多いようです。
> HTML文書の擴張子は不定です。仕樣書のどこにも「HTML文書の擴張子は*.htm/*.htmlでなければならない」等とは書かれてゐません。例へば、cgiの吐出すHTML文書に擴張子は附いてゐません。それでもcgiの吐く文書は立派なHTML文書です。
> サーヴァからhttp應答ヘッダにContent-type:text/htmlを附けられて送信された文書は皆HTML文書です。
> 擴張子が*.htmlの文書を「HTML文書」と看做すのは、
> 擴張子で文書の種類を判斷するWindows(や、Windowsの使用に合はせて擴張子でも文書の種類を判斷するMac)だけです。
0511460
02/03/13 22:02ID:???ぷっ,その書き込みでおれが一番救われた(笑
0512nobodyさん
02/03/13 22:03ID:???>>504
Mainが誤りだと指摘されたのがそんなに悔しかったのか?
大文字小文字を識別する言語なら当然だろうが。
それとも、まさか指摘するべきじゃなかったと言いたいのか?
0513nobodyさん
02/03/13 22:04ID:???0514460
02/03/13 22:09ID:???Mainとmainが黒と白以上に違うもんなのは十分承知。
ちなみに勘違いしてるようだが,おれは最近そのスレ見つけたんだよ。
書き込みすらしたことない。
0516レンタル掲示板
02/03/13 22:33ID:???どういう仕組みなの?
細かいところはどーでもいいので、大きな部分が知りたい。
0517nobodyさん
02/03/13 22:37ID:???もう出てくんなよ
0520460
02/03/13 22:50ID:???ごめんよ。
0521nobodyさん
02/03/13 23:14ID:???0522nobodyさん
02/03/13 23:19ID:???通常、私は
&hoge;のような形でサブルーチンを使っているのですが、
&hoge("section1","section2");
のような引数をかっこに入れた使い方を見たことがあります。
取り立ててその使い方がわからなくても使えてはいるのですが、
もしよろしければ、これの意味を教えて下さいませ。
0524nobodyさん
02/03/13 23:33ID:???読んでいません。
普通、なにかの処理のなかで
&sub_routin 呼び出せば、そこまでのグローバル変数と$_がそのまま使えますので、
それ以上の使い方をしたことがないのです。
ですから、よく、というか、全く理解していないのが現状です。
人の作ったCGIを、自分の好みのデザインに変えるくらいの作業しかわからないのですが
このあたり、どういう意味なのか理解したいなとは思っています。
お願いします。
0526春chu予防係
02/03/14 00:47ID:???&sub_routine('hoge','pau');
で呼び出すと、
sub sub_routine {
($a,$b) = @_;
...
}
とすることで、$a,$bに引数を受け取れます。
グローバル変数で受け渡しすると、どの変数をどこで書き換えたか
管理するのがめんどうになってくるので、引数で渡したほうが
べんりですよ。あとからそのサブルーチンを使いまわすときも
効果大です。
perlは、他人のソースから学ぶのが非常に困難なトリッキーな
言語だと思いますので、入門書等の平易なソースを見ながら
勉強したほうが楽だと思います。
ちなみに私は、一度書いた自分のソースでさえ、あとから見ると
なにをやってるのか、その記述にどんな必然性があるのか、
わからなくなることがしょっちゅうです。
0527526
02/03/14 00:51ID:???すまぬ。
($a,$b) = @_;
↓
local($a,$b) = @_;
に訂正です。
余計な疑問が沸かないように省略したら、逆にグローバル変数と
変わらなくなってしまった・・・アフォだオレ
0528nobodyさん
02/03/14 00:53ID:???print $answer; # 15
sub plus {
my ($x,$y) = @_; # @_は&plus(ここ)にあったものを渡す 今回は@_ = [5,10]
my $xy = $x + $y;
return $xy; # 返す
}
本読まないで言語習おうなんて甘いと思うけどね
0529nobodyさん
02/03/14 01:17ID:???print $answer;
sub plus {
return $_[0] + $_[1];
}
俺ならこうしちゃうけど、一度変数に格納した方がいいのかね?
0531nobodyさん
02/03/14 01:39ID:???0532nobodyさん
02/03/14 01:57ID:???>>529
あとから見るときの為に分かりやすい名前つけておいた方がいいとか読んだから
俺は変数に入れてるけど、使う人の好みだよね。
0533526
02/03/14 02:07ID:???すまぬ。いつものくせで
local($a,$_) = @_;
とか書くもので。
みんな、関数の中で $_ つかうときどうしてるのー?
0536nobodyさん
02/03/14 02:13ID:???漏れの場合、
&hoge($_);
sub hoge{
$temp = $_[0];
}
とかにしちまう。
0538nobodyさん
02/03/14 02:52ID:???クッキーの解説でも「パスが省略されると、アクセスしたリソース(HTML、CGI)のパスがセットされます。」とか本当にあってる?
とほほではそのスクリプトのフォルダ全部にパスかかるって書いてたと思うんだけど・・・
参考にしても大丈夫かな?
0539nobodyさん
02/03/14 06:55ID:???正規表現で前方一致させるにはどうしたらいいんでしょう?
$i = 0;
undef(%color);
foreach $name ('田中', '鈴木', '佐藤') {
$color{$name} = $i++;
}
田中角栄でも真紀子でも0を、鈴木一郎でも宗男でも1を、という具合に
定義したいんです。よろしくお願いします。
0542nobodyさん
02/03/14 07:59ID:???意図を理解するまでちょっとかかったぞ・・・
(ここに>>539のソース)
$in = <>;
undef $result;
while( ($name,$col) = each %color) {
$result = $col,last if $in =~ /^$name/;
}
て感じでどうかね。
0543nobodyさん
02/03/14 08:56ID:???すみません、私の説明不足でした。
1,foo,田中角栄,bar
2,foo,鈴木一郎,bar
3,foo,田中真紀子,bar
4,foo,佐藤三郎,bar
5,foo,佐藤栄作,bar
6,foo,鈴木宗男,bar
・
・
以下続く
というようなファイルがありまして、必ず田中、'鈴木、佐藤の順に
並べ替えるにはどうしたいいかと試行錯誤しておりまして、以下の
ようになっているんです。
$i = 0;
undef(%color);
foreach $name ('田中', '鈴木', '佐藤') {
$color{$name} = $i++;
}
@LINES = map {$_->[0]}
sort {$color{$a->[3]} <=> $color{$b->[3]}}
map {[$_, split /,/]} @LINES;
>>542でいただいたソースを貼ってみましたがうまくいかないようです。
アドバイスいただければ幸いです。よろしくお願いします。
0544nobodyさん
02/03/14 09:55ID:???初心者なもんで粗野ですが、こんな感じでやってみました。
%name = ();
@lines = ();
$i = 0;
while ($line = <DATA>) {
push(@lines, $line);
$tmp = (split(/,/, $line))[2];
$name{$tmp} = $i;
++$i;
}
@permutation = qw(田中 鈴木 佐藤);
foreach $fam (@permutation){
foreach $full (keys %name) {
if (index($full, $fam) == 0) {
push(@result, $full);
}
}
}
foreach(0 .. $#result) {
print $lines[$name{$result[$_]}];
}
__END__
1,foo,田中角栄,bar
2,foo,鈴木一郎,bar
3,foo,田中真紀子,bar
4,foo,佐藤三郎,bar
5,foo,佐藤栄作,bar
6,foo,鈴木宗男,bar
0545543
02/03/14 10:16ID:???早速ありがとうございます。申し訳ありませんが、どうやって>>543に
移せばいいのでしょうか?私、perl二日目でしてよくわからないんです。
お手数をおかけして申し訳ありませんが、どうかよろしくお願いします。
0546nobodyさん
02/03/14 10:25ID:???結果を@LINESに入れるなら、
print $lines[$name{$result[$_]}];
を、
push(@LINES, $lines[$name{$result[$_]}]);
で大丈夫だと思いますが。
0547オ
02/03/14 10:36ID:???期待した結果が得られません。ご指導のほど宜しくお願い致します。
WEBサーバー:AN HTTP Daemon ver1.38
1、DOSプロンプトから実行。
2、”localhostに接続できません。”
3、(ToT) アウゥー
以下からソースです・・・
use Socket;
$hostname = 'localhost';
$port = getservbyname('http', 'tcp');
$proto = getprotobyname('tcp');
$iaddr = inet_aton($hostname) or die "$hostnameが見つかりません。\n";
$paddr = pack_sockaddr_in($port, $iaddr);
$socket_addr = pack_sockaddr_in($port, $iaddr);
socket(SOCKET, PF_INET, SOCK_STREAM, $proto) or die "ソケットを生成できません。\n";
connect(SOCKET, $paddr) or die "$hostnameに接続できません。\n";
select(SOCKET); $|=1; select(STDOUT);
print SOCKET "GET /index.html HTTP/1.0\r\n";
print SOCKET "\r\n";
while (<SOCKET>){
m/^\r\n$/ and last;
}
while (<SOCKET>){
print $_;
}
ここまでです・・・
0548nobodyさん
02/03/14 11:05ID:???素直にLWPにしとけ。
どうしてもSocketを使いたいなら、せめてIO::Socketにしとけ。
0550547
02/03/14 12:14ID:???>>548
すんません、LWPってなんですかね?調べてみます。
IO::Socketのりてんってなんですかね?
>>549
もちろんサーバーのポートはデフォルトの80です!
ちなみにどんな内容がかえってくるのですか?
たびたび申し訳ないですがよろしくおねがいします。
0551549
02/03/14 12:42ID:???index.htmlが無いので404が帰ってくるだけですが、次のような出力でした。
ちなみにperlはv5.6.1 built for cygwin-multiと
ActivePerl 5.005_03で実行しました。
<HTML><HEAD><TITLE>Error </TITLE></HEAD>
<BODY>
<H1>Error 404</H1>
Not found - file doesn't exist or is read protected
<HR><ADDRESS><a href="http://www.st.rim.or.jp/~nakata/">AnWeb/1.36b</a></ADDRESS>
</BODY></HTML>
0552nobodyさん
02/03/14 12:45ID:???何となくわかりました・・・
一応本は、オライリーのネズミの絵の奴とラクダの絵の奴を読みました。
一つのことを理解しようとするとき、いろんな要素で、ほかの知識が
必要になったりして、積み残したり理解できなかったりする知識があったりします。
本当にありがとでした
0553547
02/03/14 13:09ID:???ActivePerlってことは環境はWinですよね?
うーん、私が接続できないってことはサーバー設定に問題があるんですかね?
ちなみにサーバーは何を使用されてますか?
Apacheがいいのかな?
0555553
02/03/14 13:37ID:Ibnv+vbs>>551を見ればわかるけどAn HTTPDですよ
ほんとだ「AnWeb/1.36b」はずかしー。
>>そもそもWEBブラウザではlocalhostに接続できますか?
できますよー^^
手軽にローカルでテストするから使用するんですよ。
けど同じ環境でできないのならやっぱり設定ですかね?
551さんと同じ設定にして試したいので設定公開していただけないでしょうか?
0556nobodyさん
02/03/14 14:07ID:???HTTPサーバ機能 HTTPバージョン1.1 ポート80
ちなみに$paddrを↓こうしてもconnect失敗しますか?
$paddr = pack_sockaddr_in(80, inet_aton('127.0.0.1'));
0557555
02/03/14 15:15ID:Ibnv+vbsおおー!できましたー!ありがとうございます!
>>$paddr = pack_sockaddr_in($port, $iaddr);
↓
>>$paddr = pack_sockaddr_in(80, inet_aton('127.0.0.1'));
すなおにgetservbynameを使わずに’80’を指定すればいいのですね?
興味本位ですが、みなさんはSOKETを使ってどのよな処理をされるのですか?
0559nobodyさん
02/03/14 20:30ID:???死んじまえ
きいろいぶためを やっつけろ
金で心を 汚してしまえ
死ね死ね死ね死ね
日本人は じゃまっけだ
きいろい日本 ぶっつぶせ
死ね死ね死ね 死ね死ね死ね
世界の地図から 消しちまえ 死ね
死ね死ね死ね 死ね死ね死ね
死ね死ね死ね 死ね死ね死ね
死ね死ね死ね 死ね死ね死ね
死ね死ね死ね 死ね死ね死ね
死ね死ね 死ね死ね死ね死ね
死んじまえ
きいろいさるめを やっつけろ
夢も希望も うばってしまえ
死ね死ね死ね死ね
地球の外へ 放りだせ
きいろい日本 ぶっつぶせ
死ね死ね死ね 死ね死ね死ね
世界の地図から 消しちまえ 死ね
死ね死ね死ね 死ね死ね死ね
死ね死ね死ね 死ね死ね死ね……
この歌を歌っている人を教えて下さい。
気になってPerlのスクリプトが書けません。
0560nobodyさん
02/03/14 20:35ID:???0561nobodyさん
02/03/14 20:36ID:83vwJ138キャッツアイズとヤングフレッシュだよ。
しっかりコーディングしてね。
0562nobodyさん
02/03/14 20:38ID:???どっかにフラッシュムービーあったね。
0564nobodyさん
02/03/14 20:43ID:???ttp://music.2ch.net/test/read.cgi/asong/1011726043/
とりあえずこっち行け。
0565nobodyさん
02/03/14 21:39ID:???死んじまえ
きいろいぶためを やっつけろ
金で心を 汚してしまえ
死ね死ね死ね死ね
日本人は じゃまっけだ
きいろい日本 ぶっつぶせ
死ね死ね死ね 死ね死ね死ね
世界の地図から 消しちまえ 死ね
死ね死ね死ね 死ね死ね死ね
死ね死ね死ね 死ね死ね死ね
死ね死ね死ね 死ね死ね死ね
死ね死ね死ね 死ね死ね死ね
死ね死ね 死ね死ね死ね死ね
死んじまえ
きいろいさるめを やっつけろ
夢も希望も うばってしまえ
死ね死ね死ね死ね
地球の外へ 放りだせ
きいろい日本 ぶっつぶせ
死ね死ね死ね 死ね死ね死ね
世界の地図から 消しちまえ 死ね
死ね死ね死ね 死ね死ね死ね
死ね死ね死ね 死ね死ね死ね……
おれも歌って見ました…てへ
■ このスレッドは過去ログ倉庫に格納されています