Perl コーディング初心者質問コーナー Part25
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
03/06/28 01:18ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
関連スレ
【Perl上級者コーナーPart01】
http://pc2.2ch.net/test/read.cgi/php/1024741312/
CGI: Common Gateway Interface part 11
http://pc2.2ch.net/test/read.cgi/php/1055597189/
【Perl,CGI】参考書籍 第三版
http://pc2.2ch.net/test/read.cgi/php/1030209573/
【 スクリプト改造工房 PART 6 】
http://pc2.2ch.net/test/read.cgi/php/1047806915/
過去ログやお勧めサイトは >>2-10
0321nobodyさん
03/07/07 18:41ID:???0322nobodyさん
03/07/07 18:52ID:???0323nobodyさん
03/07/07 23:41ID:C7AyQ56Asort {$form{$a} <=> $form{$b}} keys %form
このように定義したのですが、これでは未定義の値が数値より上に
きてしまいます。
sort {($form{$a} <=> $form{$b}) <=> ""} keys %form
こんな感じでやったりいろいろ試したのですが、どうしても数字が
上にきてくれません。
ご存知方がいらっしゃいましたら、教えてください。
宜しくお願いいたします。
0324あぼーん
NGNG未定義値は数値に変換すると0になるからだよ。
後ろに行って欲しいならありえないくらい大きな値にすればいい。
my $infinity = 10000 ** 10000;
# 方法その1
@result = sort {
(defined($form{$a}) ? $form{$a} : $infinity)
<=> (defined($form{$b}) ? $form{$b} : $infinity) } keys %form;
# 方法その2 "シュワルツ変換"イディオムを使う。
# データが多い場合はこっちの方が速い。
@result = map{ $_->[0] }
sort{ $a->[1] <=> $b->[1] }
map{ [ $_, defined($form{$_}) ? $form{$_} : $infinity ] } keys %form;
0326nobodyさん
03/07/08 00:17ID:???sort { not defined $form{a} <=> not defined $form{b} }
sort { $form{$a} <=> $form{$b} } keys %form;
0328nobodyさん
03/07/08 00:40ID:???うーん、どうもうまくいきません。
同じように数字が下にきてしまいます。
もう少し調べてみます。
>>327
ご返答有難うございます。
参考にさせていただきます。
0329nobodyさん
03/07/08 00:42ID:d6QOcge5<input type="submit" value="送信"style="background:#ffffff"
onmouseover="this.style.background='#000000'"
onmouseout="this.style.background='#ffffff'">
を、.cgi内の
<input type=submit value=\"送信\">
に組み込みたいのですが
どこをどう変えればいいのでしょうか?
教えてください。
0331329
03/07/08 00:53ID:???逝ってきます。
0332nobodyさん
03/07/08 01:05ID:???ごめんな。動作確認してなかった。
@result =
sort { !defined $form{$a} <=> !defined $form{$b} }
sort { $form{$a} <=> $form{$b} }
keys %form;
優先度がnotよりも<=>の方が高いし…
0333nobodyさん
03/07/08 01:07ID:???0334nobodyさん
03/07/08 02:11ID:???´−`).oO(素直に最初に分けたらあかんの…?)
my(@defined_key, @undef_key);
defined $_ ? push @defined_key, $_ : push @undef_key, $_ for keys %form;
my @result = (sort { $form{$a} <=> $form{$b} } @defined_key), @undef_key;
0335250
03/07/08 02:26ID:gC7FPuySEffective Perl
名前は聞いたことはありましたが、改めてネットでいろいろと
レビュー見てみました。
なんか、とってもそそられる本のようで、仰るとおり
値段もそんなに高くないし、何しろあまり厚そうじゃないのが
よさそうです。
何しろperl DBIと、あとプログラミングperl第三版のどっちかの
二冊抱えて電車乗ってるんです、最近。。。。
重いんですが、つい抱えて出かけてしまうのです。
紹介、ありがとうございました。
0336nobodyさん
03/07/08 02:51ID:???それでやってもいきませんでした、、、
うーん、深いです、、、
考えるだけ考えてみたいと思います。
いろいろとご支援有難うございます。
0337nobodyさん
03/07/08 03:21ID:???#!/usr/bin/perl
use LWP::UserAgent;
$ua = LWP::UserAgent->new;
$ua->agent("$0/0.1 " . $ua->agent);
$req = HTTP::Request->new(GET => 'http://www.yahoo.co.jp/');
$req->header('Accept' => 'text/html');
# リクエストの送信
$res = $ua->request($req);
# 出力のチェック
if ($res->is_success) {
print $res->header; # ヘッダー全体を出したいっ!!
print $res->content;
}
else {
print "Error: " . $res->status_line . "\n";
}
print $res->header; のところで、レスポンスヘッダー全体を出力したいのですが、
何故か、空が返されます
0338nobodyさん
03/07/08 03:38ID:???$res->headers->as_string; …かな。
ttp://member.nifty.ne.jp/hippo2000/perltips/HTTP/Response.html
ttp://member.nifty.ne.jp/hippo2000/perltips/HTTP/Message.html
ttp://member.nifty.ne.jp/hippo2000/perltips/HTTP/Headers.html
0339262
03/07/08 10:48ID:yiVOHQJTもう一度ソース貼ります。
eval{ flock(FILE,2); };
if($@){ &MkDIR ; }
$@ は直前の eval のエラーが格納されるということで
flock 関数が使えなかった場合の保険に mkdir でロックしたい。
ということなんです。
けど、エラーが出ないということは $@ には何も入らないという事になるんでしょうか?
結局はflock が使えるのか使えないのかを知りたいということなんですが判断の仕方が解らないんです。
最初から他のファイルロック方法を実現しろという話は無しの方向で。
ご意見お願いします。
0342nobodyさん
03/07/08 11:51ID:???Windowsだと、9x系はエラー(かどうかは分からんが、evalらずに素で実行すると
スクリプトは停止)になるよ。
ちゃんと確認したいところだけど、うちは全部NT系にしちゃったんで。
0343nobodyさん
03/07/08 12:17ID:???レスありがとうございます。しかし、期待したデータではありませんでした…。
期待するデータは HTTP/1.x 200 OK とかサーバーが返すレスポンスヘッダーなんです。
0344nobodyさん
03/07/08 12:34ID:???ヘッダじゃなくレスポンスコードだろ
>print $res->header; # ヘッダー全体を出したいっ!!
print $res->code . $res->message;
0345nobodyさん
03/07/08 13:02ID:???6.1 ステータスライン
レスポンスメッセージの最初の行は、プロトコルのバージョン、ステータスコード番号、それに関連したテキストフレーズからなるステータスラインで、それぞれの要素は、SP によって分けられる。最後の CRLF シーケンス以外には、CR も LF も許されない。
Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF
6.2 レスポンスヘッダフィールド
レスポンスヘッダフィールドを用いて、サーバはステータスラインに置けないレスポンスに関する追加的な情報を渡すことができる。これらのヘッダフィールドは、サーバについてや、 Request-URI によって識別されるリソースへの更なるアクセスに関する情報を与える。
0346nobodyさん
03/07/08 13:11ID:???すいません…。
HTTP/1.0 200 OK
Date: Tue, 08 Jul 2003 04:10:07 GMT
Server: Apache/2.0.46 (Unix) mod_perl/1.99_09 Perl/v5.8.0 mod_ssl/2.0.46 OpenSSL/0.9.6g DAV/2 FrontPage/5.0.2.2634 PHP/4.3.2 mod_gzip/2.0.26.1a
Last-Modified: Tue, 08 Jul 2003 04:09:31 GMT
ETag: "84f45-3d4e-63ccb4c0"
Accept-Ranges: bytes
Content-Length: 15694
Vary: Accept-Encoding
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/plain
↑こういうのが欲しいんです。
0347nobodyさん
03/07/08 13:49ID:???お前はアホか。
http://member.nifty.ne.jp/hippo2000/perltips/HTTP.html
をディスプレイに穴があくほど読め
0348nobodyさん
03/07/08 14:22ID:???my @result = sort { !defined $form{$a} ? 1 :
(!defined $form{$b} ? -1 : $form{$a} <=> $form{$b}) } keys %form;
こういうことじゃなくて?
それとももっとスマートに書けってこと?
0349nobodyさん
03/07/08 14:22ID:+KcPoM6i内容を見るって可能なの?
HTMLだったら簡単に見れるよね。それに、たとえば、abde.pl
ならば、その置き場がわかれば、ブラウザにURLを入力すると
ダウンロードできる。でも、cgiなら勝手に実行してしまう...。
何か方法あるのかな?
0350nobodyさん
03/07/08 14:30ID:???print $res->headers->header;
ってやっても何も表示されないし…
私の期待しているデータって入ってないのカナ?
0351nobodyさん
03/07/08 14:30ID:???最後に / を付けてアクセスすると、内容が表示されたという事がありました。
0352あぼーん
NGNG0354nobodyさん
03/07/08 14:56ID:???興味あるぞ、これ。
.pl ならDLして、.cgi や.html ならDLせず、画面に表示するという
事をどこで定義しているんだろうか?IEにはそんなのを
指定するところないぞ。
.pl に実行属性を持たせた後、ブラウザに入力したけど
やっぱりDLになった。という事は、クライアントサイドで
定義しているのは確か。
0356nobodyさん
03/07/08 15:04ID:???0357nobodyさん
03/07/08 15:04ID:???だめだよ、そっとしておいてあげないと
0359nobodyさん
03/07/08 15:49ID:+KcPoM6i初心者なので、教えてください。
そして、もし、サーバー上のCGIソースを見る方法を
ご存知なら教えて頂けないでしょうか。
よろしくお願い致します。
0360nobodyさん
03/07/08 15:53ID:VzazIByiみんなに怒られそうだけど、一応マジレスすると、CGIのソースが見られる
状態ってのはセキュリティ・ホールなわけ。だからマトモなサーバーで
CGIソース丸見えってのはありえないと考えてよい。
まぁ、間抜けな管理者のサーバーだと***.cgi/とか、***.cgi~ とか、***.cgi.bakとか探すと
あっさり見られたりするけど、そういうのは覗き見趣味と言ってあんまり良い趣味じゃないです。
0362349
03/07/08 16:02ID:+KcPoM6iマジレス、ありがとうございました。
大変参考になりました。
0364nobodyさん
03/07/08 16:43ID:???Wide character in print at 〜
と、エラーがでてしまいます。
たすけてっ
use LWP::Simple 'get';
use XML::RSS;
use Jcode;
$url = 'http://japan.linux.com/japanlinuxcom.rdf';
$rss = new XML::RSS;
eval { $rss->parse(get($url)); };
print Jcode->new(${$rss->{items}}[0]->{title})->sjis;
0365nobodyさん
03/07/08 16:57ID:???0367364
03/07/08 17:00ID:???>>354
Webサーバで設定します。
http://httpd.apache.org/docs-2.0/ja/mod/mod_cgi.html
0369nobodyさん
03/07/08 18:32ID:???0370nobodyさん
03/07/08 18:34ID:???指定した時間に目覚ましで起きる!
or
cron
散々外出
0371337
03/07/08 19:01ID:???print $res->headers->header;
これやっても出ないってことは、無いという事でいいんでしょうか?
0372nobodyさん
03/07/08 19:19ID:???0373337
03/07/08 19:38ID:???$res->as_string だと、内容(content)も表示されてしまいます。
どっちにしろ $res->headers->as_string も Location: とかの
データがありませんし…。
HTTP/1.1 200 OK
Date: Tue, 08 Jul 2003 10:28:34 GMT
Location: http://www.google.co.jp/
Content-Type: text/html
Server: GWS/2.1
Content-length: 2716
↑Proxomitron 等で見た場合
HTTP/1.1 200 OK
Cache-Control: private
Date: Tue, 08 Jul 2003 10:26:56 GMT
Server: GWS/2.1
Content-Length: 2716
Content-Type: text/html
Content-Type: text/html; charset=Shift_JIS
Client-Date: Tue, 08 Jul 2003 10:26:47 GMT
Client-Peer: 216.239.57.99:80
Client-Response-Num: 1
Cneonction: Close
Title: Google
↑こんな感じで出てくる
LWP では勝手に間引きしたり、追加されたりするものと理解していいのでしょうか?
0376nobodyさん
03/07/08 21:55ID:EC6mm4rUHelp!!
0377あぼーん
NGNG0378nobodyさん
03/07/08 22:29ID:SfDnct30通常はどうやって追記してますか。
var/spool/cronを直接いじってもいいのですが、
何か効率のいい方法がありましたら教えてください。
0379あぼーん
NGNG0380nobodyさん
03/07/08 22:30ID:???/var/spool/cron内はroot以外入れないですね。
それだとなおさら何か方法あるのか疑問です。
0381nobodyさん
03/07/08 22:33ID:???スレ違いだYO!
0382nobodyさん
03/07/08 23:03ID:???$ORG[1]->{kana} = "ロンドン";
$ORG[2]->{kana} = "アラバマ";
$ORG[3]->{kana} = "アラスカ";
・・・てかんじで、地名が入っているんですが、
これを並び替えたいと思ってます。
その基準は、
(1)あらかじめ定められたいくつかの地名は、優先的に、定められた順番で表示
(2)それ以外の地名は、その後にアイウエオ順で表示
です。
(1)の地名は、@seq = ("ニューヨーク","ロンドン","パリ"・・・・);
というように(この順番で)格納されているものとします。
(2)だけなら、
@tmp = sort { (${ORG[$a]->{kana}} cmp ${ORG[$b]->{kana}}) } 0 .. $#ORG;
foreach (@tmp) { push(@tmp_ORG,$ORG[$_]);}
@ORG = @tmp_ORG;
undef @tmp_ORG;
でいいとわかるんですが・・・。
これのどこに(1)を組み込めばいいのか・・・
0385の
03/07/09 00:12ID:6fG8Iq33こんな感じか?
my @seq = ("ニューヨーク","ロンドン","パリ");
my %hseq;
my $n = 0;
foreach my $i (@seq) { $hseq{$i} = ++$n; }
my @ORG;
$ORG[0]->{kana} = "カリフォルニア";
$ORG[1]->{kana} = "ロンドン";
$ORG[2]->{kana} = "アラバマ";
$ORG[3]->{kana} = "アラスカ";
$ORG[4]->{kana} = "パリ";
sub ordfunc {
my $aa = $a->{kana};
my $bb = $b->{kana};
if (defined $hseq{$aa}) {
return defined $hseq{$bb}? ($hseq{$aa} <=> defined $hseq{$bb}):-1;
} else {
return defined $hseq{$bb}? 1:($aa cmp $bb);
}
}
my @a = sort ordfunc @ORG;
$n = 0;
foreach my $i (@a) {
printf "%d: \"%s\"\n", $n++, $i->{kana};
}
--
俺的ポータルサイトを作ろう
http://mysite.ddo.jp/
0386あぼーん
NGNG0387の
03/07/09 00:20ID:6fG8Iq33すまん、一箇所間違ってた。
>return defined $hseq{$bb}? (defined $hseq{$aa} <=> $hseq{$bb} ):-1;
<return defined $hseq{$bb}? (defined $hseq{$bb} <=> $hseq{$aa} ):-1;
0388あぼーん
NGNG0389nobodyさん
03/07/09 07:37ID:???LWPモジュール使わずにソケット使って通信するプログラムを作れと言っている。
既存のモジュールの機能に満足できないのであれば、自作するしかないだろ?
0390nobodyさん
03/07/09 13:02ID:???>Location: とかのデータがありませんし…。
ProxyomitronとLWPは全く同じリクエストを送ってるのか?
Host指定するとLocationは来ないぞ。↓参照
$ telnet www.google.com 80
Trying 216.239.39.101...
Connected to www.google.com.
Escape character is '^]'.
HEAD / HTTP/1.1
Host: www.google.co.jp
Connection: close
HTTP/1.1 200 OK
Content-Length: 2716
Server: GWS/2.1
Date: Wed, 09 Jul 2003 04:01:05 GMT
Content-Type: text/html
Cache-control: private
Set-Cookie: PREF=ID=2f2a324164376c04:LD=ja:TM=1057723265:LM=1057723265:S=N4MltwrSeSo_i7Vp; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.co.jp
Connection closed by foreign host.
0391nobodyさん
03/07/09 13:05ID:???とりあえずLWP::UserAgent->new(parse_head => 0);にしたら
Content-Type: text/html; charset=Shift_JIS
Title: Google
は消える。
これはHTMLのHEAD内を解析して取ってくるオプションだから。
で、Client-XXXはソース見たらLWP::UserAgentが勝手に埋め込んでるみたいだな。
こいつは抜き取るしかなさそうだが、同じ名前で送られてこないとも限らないか。
Locationはリダイレクト。
http://www.google.com/にリクエストしてhttp://www.google.co.jp/に行けって言われてるんじゃないの?
これはデフォルトがリダイレクト先を取得する設定になってるから出てこない。
リダイレクトしないように設定すればおけ。
Cneonctionについてはぐぐってくれ;-)
※Connectionじゃないのなw
というわけで、
$ua = LWP::UserAgent->new(parse_head => 0, requests_redirectable => []);
みたいにオプションつけて、HEADで取得、Client-XXXを適当に消す、って感じか。
オプションの意味についてはちゃんと自分で調べてくれよ。
あとリダイレクトなんかで$res->is_successが偽になる場合もあるから注意。
302 Foundとかね。
まあ、純粋なヘッダが欲しいんなら自分で作った方がいいかもしれないけどね。
0392nobodyさん
03/07/09 13:20ID:???print $res->headers_as_string; じゃダメなの?
Cache-Control: private
Date: Wed, 09 Jul 2003 04:15:46 GMT
Server: GWS/2.1
Content-Length: 2716
Content-Type: text/html
Content-Type: text/html; charset=Shift_JIS
Client-Date: Wed, 09 Jul 2003 04:15:47 GMT
Client-Peer: 216.239.57.99:80
Client-Response-Num: 1
Cneonction: Close
Set-Cookie: PREF=ID=4bbf69507377e862:LD=ja:TM=1057724146:LM=1057724146:S=ISp-xtd
7MZcyLh4p; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.co.jp
Title: Google
0393nobodyさん
03/07/09 13:31ID:???Cache-Control: private
Connection: close
Date: Wed, 09 Jul 2003 04:28:10 GMT
Pragma: no-cache
Content-Type: text/html;charset=euc-jp
Client-Date: Wed, 09 Jul 2003 04:28:10 GMT
Client-Peer: 210.81.150.5:80
Client-Response-Num: 1
P3P: policyref="http://privacy.yahoo.co.jp/w3c/p3p.xml", CP="CAO DSP COR CUR ADM
DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY O
NL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
Title: Yahoo! JAPAN
0395337
03/07/09 14:19ID:???レスありがとうございます。
> というわけで、
> $ua = LWP::UserAgent->new(parse_head => 0, requests_redirectable => []);
> みたいにオプションつけて、HEADで取得、Client-XXXを適当に消す、って感じか。
> オプションの意味についてはちゃんと自分で調べてくれよ。
おおかた、>>391 さんの言っている事が理解できました。
あとは、自分で調べてやってみます。
※使っている PC がへぼいせいかもしれませんけど、
LWP の最初のロードが遅いですね
0396nobodyさん
03/07/09 18:32ID:T8daMjJB不可能なのでしょうか。
できるならcrontab編集ツールとか作りたいの
だけど、、、
0397nobodyさん
03/07/09 18:50ID:???むしろ、運用の方が大変じゃないかなぁ。
何を突っ込まれるか分からないわけだし。
0398nobodyさん
03/07/09 19:36ID:???お返事有難うございます。
ええと、初心者のためいまいちイメージが湧きません。
標準入力から書き込む、ということは具体的にどういったことでしょうか。
度重なる質問すみません。
0399nobodyさん
03/07/09 20:14ID:???標準入力へ書き込むって事じゃ?
open( CRONPIPE, "| crontab - " );
・
・
・
close( CRONPIPE );
0400nobodyさん
03/07/09 20:50ID:???_,,..i'"':,
|\`、: i'、 ≡≡≡(´⌒;;;≡≡≡
.\\`_',..-i
.\|_,..-┘ ズサーーーーーー
0401nobodyさん
03/07/09 20:57ID:???0402nobodyさん
03/07/09 21:10ID:PDgcqehQPerlじゃないよヴォケ。JavaScript逝けや
0406nobodyさん
03/07/09 23:31ID:???mysqlで、主キーにAUTO_INCREMENTついたテーブルに
insertした場合、insert後に主キーが何になったかを知る方法ってありますか?
DBIつかってて、今は、普通に$dbi->do(..でSQL文発行してます。。
0408nobodyさん
03/07/10 02:24ID:???0409nobodyさん
03/07/10 02:25ID:???0410nobodyさん
03/07/10 02:30ID:izTOLa86ってことはできますか?
レスキューのminibbsのちょっと前のを使っているのですが
そのまま使うと掲示板自体を表示しちゃうんです
0411nobodyさん
03/07/10 02:33ID:???0412nobodyさん
03/07/10 02:46ID:izTOLa86投稿してクッキーとして記録された名前などを、別のcgiで流用し
たいのです。
元のBBSのスクリプトのクッキー部分を移植すると動作はしますが、
その後にその掲示板が表示されてしまうのです。 これです、行間詰めてます。
$reloadに掲示板のURLが設定してあるのです。
$cookies= $ENV{'HTTP_COOKIE'};
@pairs = split(/;/,$cookies);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$name =~ s/ //g;
$DUMMY{$name} = $value;
}
@pairs = split(/,/,$DUMMY{$reload});
foreach $pair (@pairs) {
($name, $value) = split(/:/, $pair);
$COOKIE{$name} = $value;
}
0414nobodyさん
03/07/10 03:34ID:???cookieに何を書き込むかは発行するCGIが決める。
読んだcookieのどの部分を使うも読んだCGIが決める。
ルーチン丸ごと使うからそんなことになるんだよ。
0415あぼーん
NGNG0416あぼーん
NGNG0417nobodyさん
03/07/10 06:46ID:???頭悪いと大変ですね。
0418nobodyさん
03/07/10 09:35ID:wjfeVSSe頭悪くて申し訳ないですけど、
解決策教えてもらえないですかね?
頼みます。
■ このスレッドは過去ログ倉庫に格納されています