Perl 初心者コーナー Part23
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
03/05/16 11:18ID:zDRBc/j4【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
CGIだけど、なんか質問ある? Part 10
http://pc2.2ch.net/test/read.cgi/php/1048686475/
【Perl,CGI】参考書籍 第三版
http://pc2.2ch.net/test/read.cgi/php/1030209573/
CGIに依存しないPerlの話題一般/Part2
http://pc2.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は、【 スクリプト改造工房 PART 6 】
http://pc2.2ch.net/test/read.cgi/php/1047806915/
過去ログやお勧めサイトは >>2-10
0655nobodyさん
03/05/30 22:04ID:v3ScOAWpを
%b = (1_b => "a",2_b => "b")
ってことじゃねーの?
0656nobodyさん
03/05/30 22:45ID:???0657653
03/05/30 23:01ID:???すみません。
>>655の解釈の通りです。
連想配列の解説を読みあさって、自分でも作ってみました。
while (($key, $value) = each(%B)) {
$A{"b_$key"} = $value;
}}
一応、期待通りに動いてはくれているのですが、
もう少しスッキリ書けないものかと思いまして。
これが最善の用法ですかね?
0658nobodyさん
03/05/30 23:11ID:v3ScOAWp<!--#exec cgi="./acslog.cgi" -->でアクセスされたときと、
http://aaa.net/acslog.cgiでアクセスされたときを分岐したいのですが、
無理ですか?
0659658
03/05/30 23:13ID:v3ScOAWp適当ですのでお気にしないでください。
0660nobodyさん
03/05/30 23:38ID:TYAZIilihttp://homepage3.nifty.com/coco-nut/
http://www.k-514.com/
0661nobodyさん
03/05/30 23:52ID:???それでできるなら、それでいいんじゃない?
俺なら・・・
while (($key, $value) = each(%B)) {
$key .= '_b';
$A{$key} = $value;
}
こうするけどね。
>>658
あのさ・・・
本当に教えてほしいなら、ちゃんと質問しようよ・・・
何を質問したいのか?って所から考えちゃったよ・・・
HTMLに埋め込んでるSSIで呼び出されたCGIファイルの実行結果と、
CGIファイル直接アクセスされた時の実行結果を変えたいって事でしょ?
SSIで呼び出す時は、GETで情報埋め込んでおいたらどう?
0662nobodyさん
03/05/30 23:56ID:???@A{ map "b_$_", keys %B } = values %B;
>>658-659
その質問は CGI 関係のスレへ振ってくれ。
あとコレ読んで。
http://www.goto.info.kanagawa-u.ac.jp/~horiyuki/rfc/rfc2606j.txt
0663653
03/05/31 01:29ID:???なるほど、そっちの方が後で読んだ時にわかりやすいですね。
ありがとうございます。
>>622
すごい。
そこまで端折れるものだったとは。
状況によって、>>661さんと>>662さんの構文を使い分けていきたいと思います。
ありがとうございました。
0664658
03/05/31 01:30ID:6mtQ8nNeSSIでacslog.cgi?aaa
とかしても意味ないんじゃないですか?
?つけても、execで実行すると.cgiで実行した結果になるんですが・・・・
0665nobodyさん
03/05/31 02:13ID:???0666nobodyさん
03/05/31 02:55ID:???・・・ヘ?
GETで値送って、その値見て処理を変えるんだよ?
直接CGIにアクセスされても、GETで値送らない限り処理変えられると思うが・・・?
とりあえず、>>665の言う通りスレ違いだから、これ以上はCGI質問板へ。
0667Name_Not_Found
03/05/31 05:21ID:yCzSry8LJavascriptでのsetTimeoutやsetIntervalでの1000msの長さに
違いが出るということはあるのでしょうか?
サーバはinfoseekで試したのですが1分30秒の間に
10カウント近くtimeの方が早く、時計を見ていた結果、
Javascriptのほうが正しいっぽいのです。
何か情報をお持ちの方、お答えをお願い致します。
0668nobodyさん
03/05/31 05:36ID:???違いが出たのなら、記述ミスを疑うべき。
0669nobodyさん
03/05/31 05:37ID:???それはPerlの問題ではない。
インターネット経由でCGIを実行するんだから、数秒のタイムラグはあって当然。
同じスクリプトをローカルで実行させてみ?
0670nobodyさん
03/05/31 09:54ID:fOVZj1BA以下のスクリプトを作ってみました。
$_ = "abc";
$h{abc} = "ABC";
$h{$1} = "XYZ";
if (/(abc)/) {
print $1,"\n"; # "abc"
print $h{$1},"\n"; # "ABC"
s /$1/$h{$1}/;
print $_,"\n"; # "XYZ"?
}
最後のプリントで"XYZ"が出力されてしまうところが理解できないのです。
置換文字列内のハッシュの添字は変数展開されないのでしょうか?
どなたかご教示ください。
0671nobodyさん
03/05/31 10:02ID:???s/($1)/$h{$1}/;
0672直リン
03/05/31 11:10ID:1EAhrEiJ0674nobodyさん
03/05/31 15:03ID:???>>671 の補足。
s/PATTERN/REPLACEMENT/
PATTERN 中の $1 は直前まで持っていた値
REPLACEMENT 中の $1 は PATTERN 中で代入された値
s/$1/$h{$1}/ の PATTERN には () が無いので
REPLACEMENT で参照される $1 は既に undef
$h{$1} = "XYZ" の段階で $1 は undef
よって s/$1/$h{$1}/ は s/abc/XYZ/ と等価
0675nobodyさん
03/05/31 16:21ID:???いつか、ちゃんと勉強しなおそうとは思うけど。
0676670
03/05/31 17:14ID:fOVZj1BA良く分かりました。どうも有り難うございます。
ハッシュの添字は変数展開されないのかしら、と思ったのは、勉強中の
「初めてのPerl」という本に次の記述があったからです。
(以下引用)
@fred = ('hello','dolly');
$y = 2;
$x = "This is $fred[$y-1]'s place"; # "This is dolly's place"になる
インデックスの式はーあたかも文字列の外部に置かれているかのようにー
普通に評価されていることに注意しましょう。まず最初にインデックスの
式に対して変数展開が行なわれるわけではないのです。
(引用終り)
この部分、何を言っているのかさっぱり分からない(変数展開してると思う)
のですが、配列のインデクスに対して変数展開が行なわれないのなら、
ハッシュの添字に対しても同じことかな、と思ってしまったのです。
変数展開する/しないで頭の中ゴチャゴチャです。
0678nobodyさん
03/05/31 18:10ID:???> インデックスの式に対して変数展開が行なわれるわけではない
"$y-1" を "2-1" という「文字列」に展開してしまうのではく、
「$y - 1」という式として扱う、つまりダブルクォート文字列外と
同じく添え字を表す式として使える、と言いたいんだろう。
もしインデックスの式に対してまで変数展開が行われるとしたら、
$x = "This is $fred[$y-1]'s place"; は
$x = qq/This is $fred["2-1"]'s place/; として扱われ、
文字列 "2-1" を数値として評価し、結果 $fred[2] を見る事に
なってしまう。
0679nobodyさん
03/05/31 18:11ID:???0680nobodyさん
03/05/31 18:32ID:???↑このスラッシュの前後で、
$1の中身が"abc"→undef となるのか。勉強になった。
0681nobodyさん
03/05/31 19:42ID:???ボタンをクリックして処理を始めるというのがいまいちわかりません。
投稿 ボタンをクリックすると、 投稿処理が始まりますよね?
どのようにしていその処理に移ればいいのでしょうか?
厨な質問でスマソ・・・
0682nobodyさん
03/05/31 21:02ID:???0683nobodyさん
03/05/31 21:16ID:???どうもCGIを作りたいみたいだから、先に
スレタイを読んで理解すること、HTMLを理解することを薦める。
HTMLを理解しないとどうせCGIからHTMLを吐けないからね。
<form action="hoge.cgi">
0684nobodyさん
03/05/31 21:16ID:???×Perlについて興味を持ち始めたんですが、
○CGIについて興味を持ち始めたんですが、
×厨な質問でスマソ・・・
○スレ違いな質問でスマソ・・・
0685nobodyさん
03/05/31 21:20ID:FYLpMA2Jスレ違いだけど教えてやる。
投稿をクリックするとform actionで指定されたcgiを呼び出す。
で、呼び出されたcgi側でフォームで指定されたメソッドにしたがって処理。
0686nobodyさん
03/05/31 21:26ID:???このスレの方が大抵いつも上にあるから?
0687_
03/05/31 21:30ID:???0688nobodyさん
03/05/31 21:39ID:Ecff4K+l0689nobodyさん
03/05/31 21:49ID:???0690nobodyさん
03/05/31 22:00ID:qGkh6pMiアッタマイイ(・∀・)!!
0691nobodyさん
03/05/31 22:18ID:ZijosZeyxmailでメール送信する場合って、
open(MAIL, "| /usr/sbin/xmail/sendmail -t");
で送れるんですか?
0692nobodyさん
03/05/31 22:23ID:???詳しく説明してる様なサイトってないでせうか?
0695nobodyさん
03/05/31 22:41ID:???> my $filesize = -s $filename;
my $filesize = (-s $filename);
スマソ
0696693
03/05/31 22:42ID:???0697nobodyさん
03/05/31 22:58ID:m6zPJsPy0699nobodyさん
03/05/31 23:11ID:???マルチうざいです。
しかも、向こうで答えようとしている人がいるのに何でマルチするのですか?
なぜ、わざわざスレ違い、いや板違いであるこのスレで質問するのですか?
そして、textareaのスクロールバーなのか、
ウィンドウのスクロールバーなのかくらいハッキリさせろ。
cf. http://pc2.2ch.net/test/read.cgi/hp/1053619342/226 だよね?(´Д⊂ク
0700nobodyさん
03/05/31 23:15ID:ZijosZey板違いの何がいけないんですか?
0703612
03/05/31 23:31ID:3Wm6q7+jいちおうNet::SSLeayというモジュールが必要ということで
ppm install Nea::SSLeay としてやってみたもののうまくできません。
どうすればよいでしょうか?
perl初心者ですが申し訳ありません。
650さんにものが足りないといわれましたが、なにが足りないのでしょうか?
0704nobodyさん
03/05/31 23:33ID:ZijosZeyマンコ
0705nobodyさん
03/05/31 23:33ID:???>>700
何の板なのか、そしてここは何のスレかを腹筋しながら50回音読してください。
# 向こうで答えが出ているのにわざわざマルチするなんて最低だよq(^-^)
0706nobodyさん
03/05/31 23:45ID:???1 スタートメニューからperl package managerを起動する
2 search sslする
3 Crypt-SSLeayが見つからなければ
repoでリポジトリを確認し、repo 2とかやって切り替える。2に戻る。
4 install (3で見つけた番号)
だったと思う。俺はもう既にインストール済みだから手順を確認できない。
0707nobodyさん
03/06/01 00:16ID:???初心者だから仕方ないでしょう。
誰でも最初は初心者に決まってるじゃないですか。
質問には全部答えてあげればいいじゃないですか。ガキじゃないんだから。
そしてスレの内容をめちゃくちゃにして誰もが不利益を被るようにすればいいじゃないですか。
0709nobodyさん
03/06/01 00:27ID:???初心者だから仕方ないでしょう。
初心者だから仕方ないでしょう。
初心者だから仕方ないでしょう。
初心者だから仕方ないでしょう。
初心者だから仕方ないでしょう。
初心者だから仕方ないでしょう。
初心者だから仕方ないでしょう。
初心者だから仕方ないでしょう。
0710nobodyさん
03/06/01 00:47ID:DeFU3cB4Win32モジュールってどこにあります?
なかなか見つからないんですが・・・
0711nobodyさん
03/06/01 01:03ID:???1.本気で自分は絶対に間違ってなく、他の全てが間違っていると考えている。
->本物。なので処置なし。放置。
2.薄々自分のやったことに後ろめたさを感じているが、認めたくない。
->厨房。頭が冷えるまで放置。と言うか物の道理がわかるまでネットにつなげるな。
3.ネタ
->放置
おお、実態がどれであろうと放置以外に選択肢がない。
0712nobodyさん
03/06/01 01:06ID:???ウィンドウズにActivePerlを入れてるなら、
スタート->検索->ファイルやフォルダで検索を開き、Win32で検索。
……Perlとかんけーねえ!?
0713動画直リン
03/06/01 01:10ID:FDrVWEME0714nobodyさん
03/06/01 01:36ID:DeFU3cB4ごめん。はじめっからはいってるんだね。
すんませんでした。
0715707
03/06/01 02:34ID:???やっと目が覚めました。
初心者だからって、それに甘えてルールを破る事って
いけないことですよね。。。
自分が甘ったれだって、気がつきました。
もう少し、勉強してきます。
ありがとうございました。
0717本当の本物707
03/06/01 03:08ID:5qKTyD6i僕が、変な質問の仕方したばかりに、
偽者が現れて、荒れてきてます。。。
>>716は、偽者です!
僕は、今ちゃんとまじめに勉強してます。
今後も、もしかしたら僕の偽者が現れるかもしれませんが、
どうか、放置してください。
本当の本当に、ご迷惑をおかけしました。。。。
IDも晒しておきます。
0718直リン
03/06/01 03:10ID:FDrVWEME0721nobodyさん
03/06/01 03:40ID:???んだから、板違い/スレ違いが来たら叩くだけだC〜
その結果スレが荒れたって困らないC〜
荒れて困るほど人が多い板じゃないC〜
0722nobodyさん
03/06/01 03:54ID:???荒れると、困るというか嫌だが、何か?
俺以外でも、そう思うヤツはいてると思うが、何か?
荒れて良いなんて思った事なんて、一度もない。
Perl使ってCGI組んでる俺は、PerlだろうがPHPだろうが、
WebProg板全体のレベルアップを願う一人だ。
0723nobodyさん
03/06/01 04:36ID:???あまりに下らない流れを発見した。
0724nobodyさん
03/06/01 04:36ID:???0725670=676
03/06/01 05:30ID:6WOnkruh有り難うございます。
$y = 2;を、$x = "$y";で展開すると、$xは2(数値)ではなく、"2"(文字列)
になるということですね。
言われてみれば当り前のことですが、これがはっきり認識できていません
でした。
0727nobodyさん
03/06/01 12:47ID:???0728nobodyさん
03/06/02 02:35ID:???unlessやらuntil使わずに、ifとwhileに!を組み合わせて使う。
ナンデダロ(・∀・)
0730nobodyさん
03/06/02 08:32ID:???ご紹介してもらえませぬか?
0731nobodyさん
03/06/02 08:38ID:???こういう所でいいのかな?
ttp://www.mikeneko.ne.jp/~lab/perl/numerical_transform/
0732nobodyさん
03/06/02 12:25ID:s70dOIFMDBのように外部キーなどを使って管理しています。
(なお、telnet使えないため、DBD::CSVモジュールなどをいれられません)
------------------------------------------------------------
●機関マスタorgmaster(orgmaster.csv)
各列は、
・orgid(主キー)
・orgname(テキスト)
・countryid(外部キー)
●国マスタcountrymaster(countrymaster.csv)
各列は、
・countryid(主キー)
・countryname(テキスト)
・seq(数値)
------------------------------------------------------------
で、単に、機関マスタを開いて、countryid別にソートして機関名を表示
(selet orgname from orgmaster order by countryid)
というのなら、以下の手順でできるというのはわかるのですが・・・
(1)機関マスタを開く
$ORG[$values[0] = {
'orgname' => $values[1],
'countryid' => $values[2],
};
(2)ソートして表示
@tmp = sort { (${ORG[$a]->{countryid}} <=> ${ORG[$b]->{countryid}}) } 0 .. $#ORG;
foreach (@tmp) {
print 'orgname='. $ORG[$_]->{orgname}. " / ";
print 'countryid='. $ORG[$_]->{countryid}. "<br>";
}
(つづく・・・)
0733732
03/06/02 12:25ID:???ここで、質問です。上記のものを変更して、
★国名も表示させるには、どうすればいいのでしょうか?
(selet orgmaster.orgname, countrymaster.countryname
from orgmaster, countrymaster
order by countryid
where orgmaster.countryid = countrymaster.countryid)
★もし可能なら、ソート順をcountrymaster.seqにするにはどうすればいいのでしょうか?
(selet orgmaster.orgname, countrymaster.countryname
from orgmaster, countrymaster
order by countrymaster.seq
where orgmaster.countryid = countrymaster.countryid)
0734732
03/06/02 12:28ID:???教えていただければ幸いです
0735nobodyさん
03/06/02 12:37ID:???わからん・・・
何を聞きたいのかが分からん・・・
手順だけを教えてくれって・・・
処理のアルゴリズムは、プログラマーが考える事であって・・・
処理方法は、何十種類も、何百種類もある。
ところで・・・お前は、ソートの動きを理解してない、いつぞやのヤツでは?
0736732
03/06/02 12:43ID:???あー、そうなんですね・・・。言われてみれば確かに。
定石でもあればと思ったのですが・・・
>ソートの動きを理解してない、いつぞやのヤツでは?
どうなんでしょう。
ソートで質問したことはあるけど、最終的には理解したつもり。。。なんですが・・・
0738732
03/06/02 14:00ID:???正直、質問したときは、どっから手をつけていいか???な状態でしたが、
ついさっきひらめきまして、方法はこんなかんじです。
なんか、想像してたよりかずっと楽にできたので拍子抜けなんですが、
どうなんでしょう?まだ冗長な部分とかありますでしょか?
▼国マスタを開いて、下のように国ごとの名称と順番を取得しておく
$COUNTRY[$values[0]] = {
'countryname' => $values[1],
'seq' => $values[$2],
};
▼機関マスタの情報を$ORGに代入する際、以下のように、
「機関マスタ.countryid=国マスタ.countryid」となるような、
国マスタ.countrynameや国マスタ.seqを、ひっぱってくる。
(ここから後は、外部テーブルを意識する必要はなく、$ORGの処理に専念すればOK)
$ORG[$values[0] = {
'orgname' => $values[1],
'countryid' => $values[2],
'country_contryname' => $COUNTRY[$values[2]]->{contryname}, #国マスタ.contryname
'country_seq' => $COUNTRY[$values[2]]->{seq},#国マスタ.seq
};
▼$ORGをいじくる(ソート基準をcountry_seqにして、表示する対象をcountry_contrynameにする)
@tmp = sort { (${ORG[$a]->{country_seq}} <=> ${ORG[$b]->{country_seq}}) } 0 .. $#ORG;
foreach (@tmp) {
print 'orgname='. $ORG[$_]->{orgname}. " / ";
print 'country_contryname='. $ORG[$_]->{country_contryname}. "<br>";
}
0739nobodyさん
03/06/02 14:33ID:???いや・・・
それでできたなら、それでいいんじゃない?
一言言わせて貰えば・・・
なぜ、二つのリファレンスで管理してるのか・・・
一つで管理してれば、そんな処理せずソートできるのに。
・・・と、この辺は、そちらの都合でそうしてるんだろうし。
これ以上、何も言う事はないかな。
何作ってるか知らんが、適度にがんがれ。
0740名無しさん@お腹いっぱい。
03/06/02 15:39ID:vewE58z20741nobodyさん
03/06/02 15:52ID:NLUHomb+グロブかディレクトリハンドルを使う。
この二つはファイル名とドットファイルの扱いが違う点に注意。
0742名無しさん@お腹いっぱい。
03/06/02 16:19ID:vewE58z20743名無しさん@お腹いっぱい。
03/06/02 19:18ID:vewE58z2検索ではなかなか出てこなくて・・・
0744nobodyさん
03/06/02 19:20ID:???横幅や縦幅を取得するにはどうすればいいのでしょうか?
0745nobodyさん
03/06/02 19:26ID:???mkdirを使う。
ちなみに「フォルダ」じゃ見つかりにくいと思われ。「ディレクトリ」で探そう。
>>744
Perlと無関係。
0747名無しさん@お腹いっぱい。
03/06/02 19:46ID:vewE58z2ありがとーう。
mkdir($Dir, 0777);としても755になっちまいましたが。
作ったディレクトリの中にファイルを作ったり出来たんで上手くいきました。
0748nobodyさん
03/06/02 19:56ID:???で、ページをSJISで吐き出していたのですが、
あるときから、ページの一部がEUCで吐き出されるようになってしまいました。
# HTMLテンプレートをオープン
my $template = HTML::Template->new(filename => $PathTmplStart);
# パラメータを埋める
&jcode::convert(\$HtmlYou_are_here, "sjis");
$template->param(
YOU_ARE_HERE => $HtmlYou_are_here,
);
# テンプレートを出力
print $template->output;
このコードで、「YOU_ARE_HERE」の部分はSJISで表示されますが、
それ以外の部分はEUCで表示されてしまいます。
テンプレファイル($PathTmplStartのファイル)はSJIS、スクリプトはEUCです。
どのタイミングからこうなってしまったかは不明ですが、
しかし、正常な表示のときと今とでは、上記コード部分はまったく変わっていません。
なお、同じcgiファイル中で、HTML::Templateを使っている全てのかしょで、
同様の現象が起きています。
いったい、どこを疑えばいいのでしょうか?
0750nobodyさん
03/06/02 20:51ID:???0751nobodyさん
03/06/02 21:09ID:8SqwvWBe0752動画直リン
03/06/02 21:10ID:mGHfwiJV0753預言者
03/06/02 21:33ID:???■ このスレッドは過去ログ倉庫に格納されています