トップページ⇒php
984コメント309KB

【Perl】初心者コーナーPart11

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん02/03/27 12:53ID:wAXxxOxP
 
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。

1と3が無いと誰も答えられないよ、良い回答は良い質問から。
一緒に勉強しましょう。

参考書籍はこちら【【Perl,CGI】参考書籍 第2版 】
http://pc.2ch.net/test/read.cgi/php/988809842/
CGIの質問はこちら【CGIだけどなんか質問ある Pert 5.01 】
http://pc.2ch.net/test/read.cgi/php/1015127347/l50
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/

過去ログ、その他の役立ち情報は>>2-10を見よう。
062362002/04/16 18:12ID:???
>>621
エラーログにはなんて出てる?
Premature end of script headers
とか出てない?
0624nobodyさん02/04/16 18:14ID:???
>>622
うーんと、Win32版でバイナリオープンてどーやんだっけ。
binmode(OUTPUT);
か。
062546902/04/16 18:26ID:???
>>556
早く答えろよゲス野郎
0626 02/04/16 18:28ID:???
>624
おかげさまで解決しました。
ありがとうございました。
0627nobodyさん02/04/16 19:27ID:r+rfWQLJ
WinXP上でActivePerl 5.6を使っています。
スクリプトのあるフォルダのパスを得るにはどうすればいいのでしょうか。
open OUT, '>./hoge';
などというようにすると、現在の作業フォルダにhogeが作成されて、
必ずしもスクリプトのあるフォルダには作成されません。
そこで、必ずスクリプトのあるフォルダにhogeが作成されるように、
スクリプトのあるフォルダのパスを得たいんです。
062862702/04/16 19:36ID:???
ごめんなさい、$0ってのがありました。
この変数の値を元に取り出すことにします。
0629hanamogera ◆kkkKkkko 02/04/16 19:44ID:QVh0tmfS
@hage = split(/<>/, "hoge<>hogehoge<>");
としたとき、@hageの要素数は2ですか?
つまり、$#hageは1になるんですか?
0630nobodyさん02/04/16 19:50ID:???
>>629
3
0631nobodyさん02/04/16 19:59ID:???
>>629
やってみりゃわかると思うけど2だ。perlfuncのsplitを読むべし。
splitはデフォルトで末尾の空文字列を省略する。

3にしたい場合は
@hage = split /<>/, "hoge<>hogehoge<>", -1;
0632nobodyさん02/04/16 20:13ID:???
ちなみに、最近このスレによく出てくる <> をデリミタにしたCGIって何なのかな?
0633nobodyさん02/04/16 20:23ID:???
>632
タグの<>を$amp;lt;&gt;に変換すると絶対に文中に<>が出てくることはないから、
CGIでは使い勝手ががいい。
0634nobodyさん02/04/16 20:24ID:???
>633
タイプミススマソ。
&と$を打ち間違える漏れって一体…(鬱
063562702/04/16 21:39ID:???
ActivePerl v5.6.1 build 631をWinXPで動かしています。
map使ってて気づいたんですが、
map { "$_", } (0..5);
を実行すると
syntax error at D:\プログ~1\hoge.pl line 1, near "} ("
Execution of D:\プログ~1\hoge.pl aborted due to compilation errors.
と言われます。
map { "$_" } (0..5);
map { $_, } (0..5);
では問題ありません。
syntax errorになる理由は何なんでしょうか。
0636nobodyさん02/04/16 22:16ID:???
>>634
心配するな俺もよくある。
それより\とyを打ち間違う漏れって一体・・・(鬱
0637nobodyさん02/04/16 22:21ID:???
map { "$_", } (0..5); が文法的に間違ってるからエラーになるんだってば。
なんで最後に , を付けたいの?
063863202/04/16 22:34ID:???
>>633
なるほど。特定のCGIがそうしてるとか、どっかのページで
推奨してるのかと思ったよん。
063963502/04/16 22:38ID:???
map { "$_", } (0..5);のどの辺りが間違ってるんでしょうか。
map { $_, } (0..5);ではエラーでないのに、
$_を"$_"に書き換えるとエラーになるのが納得いかないんです。
最後に,をつけてるのは
use Getopt::Long;
our %config = (base_uri => 'http://www.2ch.net');
GetOptions map { "$_:s" => \$config{$_} } keys %config;
print $config{base_uri};
みたいに使いたいからです。
今はmap { "$_:s" => ...をmap { $_ . ":s" => ...にして逃げています。
064063502/04/16 22:42ID:???
もちろんmap { "$_", } (0..5);の,を=>に書き換え(639であげた例のように)ても、
同じようにエラーになります。
064163702/04/16 22:59ID:???
あれ、ほんとだ。よく読んでなくてごめん。
とりあえず動くだけなら
GetOptions map { ("$_:s" => \$config{$_}) } keys %config;
にしたら動いたけど・・・・・・演算順序の関係かな?
0642nobodyさん02/04/16 22:59ID:???
map { +"$_", }(0..5);

perldoc -f map
064363502/04/16 23:15ID:???
>>641さん
いえ、読みにくい文書ですみませんでした。
perldocによると、
%hash = map { "\L$_", 1 } @array # perl guesses EXPR. wrong
%hash = map { +"\L$_", 1 } @array # perl guesses BLOCK. right
%hash = map { ("\L$_", 1) } @array # this also works
とのことです。
>>641さんの解決策は三番目にある方法ですね。
有り難うございました。

>>642さん、有り難うございました。
perldoc読むの忘れてました。申し訳ないです。
0644162202/04/17 14:48ID:v8Tp5NVP
500Internal Server Errorとでます。push(@all,$query); に変更しましたが同じでした。
$query = $ENV{ 'QUERY_STRING' };

open IN, "$send";
@all = <IN>;
close IN;

push(@all,$query);
open OUT,">$send";
foreach (@all){
print OUT $_;
}
close OUT;
この方法以外でもいいので、教えてください。

エラーログにPremature end of script headersと出ています。どうしたらいいのですか?
0645nobodyさん02/04/17 15:29ID:79RKjLpb
モジュールのBenchmarkについて解説しているサイトありませんか?
googleでいろいろ調べましたけどありませんでした。
0646nobodyさん02/04/17 15:57ID:???
>>645 perldoc Benchmarkで十分だろ。
0647Dream 黒星02/04/17 16:01ID:???
>644
CGI の質問ならスレ違いだろ! って、そのエラーログ見て解決できんのか!

>645
以下にアクセスしろ!
ttp://perldoc/-m/Benchmark/
0648nobodyさん02/04/17 16:08ID:???
>>644
>どうしたらいいのですか?

回線切って首吊って(以下略
0649Dream 黒星02/04/17 16:46ID:???
>648
なんで回線切ってなんだ?
自サーバでCGIやってるかもわからんだろうに。オマエは頭の弱いヤツだろ!
065064502/04/17 16:48ID:PRS3jaLV
英語でわけ分かりません。
Jperlを入れるとドキュメントも日本語になるんでしょうか?
065164502/04/17 16:51ID:???
ageてるし。
鬱だ詩嚢。
0652nobodyさん02/04/17 17:00ID:???
>>644
スクリプト1行目のperlパスが間違ってるとか
065364502/04/17 17:09ID:PRS3jaLV
>>650 自己レス
よく見てみたらあまりにも馬鹿な質問してる。
逝ってくる。
0654nobodyさん02/04/17 17:15ID:???
>>649 >>622でjperlのWIN32版とあるから間違い無く自サーバだろう。 そんな事も分からない馬鹿は首吊って死ね。
0655hanamogera ◆kkkKkkko 02/04/17 17:23ID:7mM3jrq9
>>631
ありがとございやした。
0656nobodyさん02/04/17 17:55ID:???
>>649 へぇ。回線繋がってないのに2chに繋がるんだすげーナ。
カスは黙ってろよ。
0657Dream 黒星02/04/17 17:57ID:???
Dream 黒星=469
065863202/04/17 18:59ID:???
>>644
1.まず、そのスクリプトをCGI経由じゃなく、単体で起動したときに、
syntax error等くだらないエラーがでて無いか確認。
2.スクリプト自体がOKなら、スクリプトの最初に
print "Content-type: text/html\n\n";
と入れる。

これでOK。
Premature end of script headers
てーのは、必要なヘッダ(Content-type)が書き込まれてないってエラー。
0659Dream 黒星02/04/17 19:37ID:???
>656
2chで書きこんだマシンとCGIやってるマシンが同一である根拠はまだ
どこにもしめされてないだろ! 決め付けでしか考えられないオマエは
もう、ダメポだな!
0660Dream 黒星 02/04/17 19:50ID:???
>656
2chに書き込んだマシンとCGIやってるマシンが同一だという根拠は?
決め付けで判断するようじゃ、オマエはもうダメポだな!
はなしにならんな、このうすらハゲがっ!

0661nobodyさん02/04/17 20:01ID:???
なにおぅ!!!
やるかっ このっっっ!!!!
0662nobodyさん02/04/17 20:01ID:???
おまえなんかしんでしまえばいい!
0663nobodyさん02/04/17 20:08ID:???
>>660
誰も鯖がどうとか何もいってねぇだろ。馬鹿丸出し。
無理して日本語使うなよボケが。
0664nobodyさん02/04/17 20:10ID:???
>>662
なんかイイなぁ、そのフレーズ。
0665nobodyさん02/04/17 20:12ID:???
Dream 黒星 = 469 は無視の方向で。
0666nobodyさん02/04/17 21:40ID:???
オマエはもうダメポだな! っつうフレーズもおれの中ではヒットだ(w
0667ADSLにしたんですが02/04/17 21:44ID:BaxakOe1
FTP接続に不具合が。。でまして。
[症状]
ログインはできてファイル受信状態でフリーズまたはタイムアウト。。
なんでしょうかね?
0668nobodyさん02/04/17 21:51ID:???
>>667
スレ違いだが、クライアントをPASVモードに設定にしる。
066946902/04/17 21:53ID:???
>>556
早く答えろよゲス野郎


0670nobodyさん02/04/17 21:59ID:???
>>669
−操作説明−
   _
 _|\\_            。      【 死 】
 |\_  _\→       (>>669)_   | ̄ ̄ ̄|
 \|  \ \__|     三   (*゜▽゜)   |    |
    ̄\| ̄|      三  (∪∪)    |    |
        ̄          ∪∪     |    |

※右キー以外は使用しません。
067146902/04/17 22:00ID:???
>>556
早く答えろよゲス野郎





0672ADSLにしたんですが逝きました!02/04/17 22:04ID:BaxakOe1
>>668 さすが。。すばらしぃありがとう。
0673Dream 黒星02/04/18 00:38ID:???
>665
なんで 469 のような無知な野郎といっしょにするのか、オマエの推論の
のまずさは後々ダメポに匹敵するほどのミスをやらかしそうで心配なのは
わたしだけならいいのだが...
0674nobodyさん02/04/18 12:08ID:CQh2avKk
すいません。hashで
$dic{"apple"} = "りんご";
としたときに、valueである"りんご"からkey"apple"を検索するには
どうすればいいんでしょか?
0675nobodyさん02/04/18 12:52ID:???
>>674 key全部なめる。同一valueが複数あるかも。
0676nobodyさん02/04/18 12:56ID:???
>>674
foreach $keys (keys(%dic)){
  if($dic{$keys} eq 'りんご'){ print "ハッケソ $keys\n"; last; }
}
とか。
0677nobodyさん02/04/18 12:57ID:???
>>675
あ、いけね。複数の場合もあるのね。lastは無しってことで。
0678nobodyさん02/04/18 14:32ID:???
状況次第だが
%rh = reverse %h;
ってのも使える。
067967402/04/18 17:19ID:pC0blCKC
あ、結局そういう一発な関数は無いのですね。
>>678 の reverse が一番近いかも。どうもでした。
0680nobodyさん02/04/18 19:13ID:BWtEryOi
$text = "URLは、http://www.hogehoge.com です。"
となっている$textの中身を、
"URLは、<a href="http://www.hogehoge.com">http://www.hogehoge.com<;/a> です。"
という風に、書き換えるにはどうすればいいのでしょうか?
0681nobodyさん02/04/18 19:24ID:???
>680
正規表現を使う。
0682nobodyさん02/04/18 20:14ID:???
>>680

$text = "URLは、http://www.hogehoge.com です。";
$text =~ s{URLは、http://www.hogehoge.com です。}{URLは、<a href="http://www.hogehoge.com">http://www.hogehoge.com<;/a> です。"};

これが不満なら日本語を勉強してから質問しろ。
0683nobodyさん02/04/18 21:10ID:???
>>680
もちっとスマートにするなら、
$text = "URLは、http://www.hogehoge.com です。";
$text =~ s{URLは、(.+) です。}{URLは、<a href="$1">$1</a> です。"};
かな。
0684nobodyさん02/04/18 21:16ID:???
>>680
Perlメモにきちんとしたやつがあるよ。>>3のリンク先くらい巡回してから質問しる。
0685nobodyさん02/04/18 22:51ID:???
>>685
正規表現の[tr]って使いにくいと思った初心者でした。
0686nobodyさん02/04/18 23:19ID:???
>>686
tr///のどこがどう使いにくいのかなあと思ったおれでした。
0687nobodyさん02/04/18 23:21ID:???
>>685
きみのカキコは冗長でスマートじゃないな。

正規表現の[tr]って使いにくいと思った。

で十分伝わる。
068868502/04/19 01:12ID:???
>>687
そうですね。
[tr]が使いににくい==初心者
ですもんねw
0689nobodyさん02/04/19 01:19ID:qPOTdo2b
$a = "a(.*?)a";
$d = "aaabbb";
$d =~ s/$a/b/;

とやったら、
s/a\(\.\*\)a/b/;
か、
s/a(.*?)a/b/;
のどちらになるんでしょうか?
0690Dream 黒星02/04/19 01:30ID:???
[tr]が使いにくいというのは、使い方がわからないのではなくて、
使い方はわかるがもっとよりよい記述法なりがあるということだろ。

そのよりよい(使い勝手のよい)のを教えてくれよ。
0691nobodyさん02/04/19 01:47ID:Z7cLdJRB
>>690
うるさいっ!ばか!
sでいいじゃないかっ!
0692nobodyさん02/04/19 01:55ID:???
>>690
「使いにくい」って言った本人が「[tr]が使いににくい==初心者」
つってんのに何妄想してんだ、この馬鹿は。
0693nobodyさん02/04/19 02:10ID:???
>>689
自分で試せば?
0694Dream 黒星02/04/19 02:19ID:???
>692
688が、先のことを言った本人だという根拠は?

わたしには685および688のIDが???である以上、両者が同一人物である
という根拠のない決め付けはできないのだが、オマエは決め付けで判断する
ダメポにも匹敵するダメダメプログラマーだろ!

0695nobodyさん02/04/19 02:34ID:???
黒 星 先 生 ダ メ ポ っ て な ん で す か ?
0696Dream 黒星02/04/19 02:52ID:???
>695
金融機関コードの違いさえも認識できずにろくなテストデータも作れずに
金融不安を巻き起こすナンチャッテプログラマー集団のことだ!
0697nobodyさん02/04/19 03:06ID:???
金融機関コードって何ですか?
0698nobodyさん02/04/19 03:14ID:???
>>696
(゚Д゚)ハァ?
おれは 黒 星 先 生 に訊いたんだよ。なんでお前が答えるんだよ。

おれはいつかお前がDream 黒星と 黒 星 先 生 とを妄想気味に同一人物と取り違えて
ダメポにも匹敵する根拠の無い思い上がりをやらかすんじゃないかと心配だったのだが
まさかこうも簡単に事が運ぶとは・・・(w
0699黒 星 先 生02/04/19 03:35ID:???
>>695
s/ダメポ/Dream 黒星/g;

Dream 黒星に関する話題は関連スレで。
http://pc.2ch.net/test/read.cgi/php/991102630/
0700Dream 黒星02/04/19 03:45ID:???
思ったとおりの展開になったので笑わせてもらったよ。

寂しいんだね。こっちは見てて寒かったよ。今夜はあったまって寝るよ。

0701nobodyさん02/04/19 05:14ID:???
(´-`).。oO(引っ掛けるほうも引っ掛かるほうもダメポだなあ…)
0702nobodyさん02/04/19 05:57ID:???
WebProg板の名無しをDream☆にしよう。
0703Dream 黒星02/04/19 07:12ID:???
>>700
>思ったとおりの展開
思ったとおりの展開に引っかかる馬鹿が居るんだね。
0704nobodyさん02/04/19 07:14ID:???
Dream 黒星=469
0705nobodyさん02/04/19 07:52ID:???
>>702
それだ!
070668702/04/19 08:09ID:???
>>685>>688
ごめん。
きみのカキコは冗長ではなく、適切、いや言葉が足りないくらいだった。

>>690には
「正規表現の[tr]って使いにくいと思った初心者でした。 」
という表現でさえ、初心者であることが伝わらなかったのだから・・・
0707nobody02/04/19 09:23ID:???
>>689

展開はまず"..."で囲った時に一回起こる => "a(.*?)a"
これは普通の文字列展開ね。だからみてわかるように何も展開
するところがないのでそのまんま。

次に正規表現として使用した時に おこる => s/$a/b/;
この場合$aを展開してるわけで、$aの中身は関係ない。すなわち s/a(.*?)a/b/;となる。

というわけでもしマッチしたらそのマッチした文字列が$1に入る事になる。
0708nobodyさん02/04/19 11:32ID:???
>>706
はじめのほうから読ませてもらったけど、論理的にはキミの負けだと思う。
朝早くから...よほど悔しかったんだね。

ダメポって、ツボにはまりそー。
0709nobodyさん02/04/19 11:43ID:???
正規表現の[tr] → 't'又は'r'を表す文字クラス
0710nobodyさん02/04/19 11:47ID:???
>>709
うむ。正規表現とtr///は全く関係ないから、それが正解だろう。
0711nobodyさん02/04/19 11:48ID:???
tr演算子は正規表現を使えない・・・
0712nobodyさん02/04/19 13:12ID:???
パスワード付きサイトの内容(検索結果のページ)を取得したいと思っています。

ログインページはGETもPOSTも使えるため、
・・・index.asp?name=AAA&pass=BBB
でログインできました。
検索結果のページもGETもPOSTも使えるため、
一度ログインしていれば、・・・result.asp?word=XXXXX
を開けばページ内容が保存されます。

これをperlでやろうとしました。

use LWP::Simple
$x = get("・・・index.asp?name=AAA&pass=BBB");
print $x;
$y = get("・・・result.asp?word=XXXXX");
print $y;

ところがこれだと、$xはログイン後のページが正しく表示されるのですが、
$yは、ログインしていないとみなされて、ログインページに飛ばされた内容が
表示されてしまいます。

解決策のヒントをよろしくお願いします。
0713nobodyさん02/04/19 13:12ID:1w9waxQZ
プロ野球オールスター人気投票!マツリだワショーイ!
http://choco.2ch.net/test/read.cgi/news/1019188835/
0714nobodyさん02/04/19 14:18ID:???
>>712
何故一度ログインすればその後はName/Pass無しでもログインしているとみなされるのか。
それを考えろ。
まぁHTTP-Headersでも見てみなさいってこった。
071571202/04/19 14:56ID:???
>>714
レスありがとうございます。
HTTP-Headersですか・・・探してみます。
071671202/04/19 18:51ID:???
>>714
すみません・・・・
HTTP-Headers自体がよくわかりませんでした・・・
もう1つヒントが欲しいです。お願いします。
0717nobodyさん02/04/19 19:37ID:???
>>716
LWPのドキュメントを調べなされ。
071871202/04/19 19:52ID:???
>>717
HTTP::Headersというやつでしょうか?
なんとなく調べるべきことがわかりました。
ありがとうございます!

ところで・・・
調べるのは調べるんですが、そもそも私が
やろうとしてることは可能なことなんですかね?(汗
0719nobodyさん02/04/19 20:05ID:sPCEXxH7
前回は、適切な助言をありがとうございました。

さて、今回はCGI RESCUEにてダウンロードした「マルチパート対応
フォームメール」(form2mail.cgi)を使っています。
その中の機能でファイルをアップロードしてメールに添付する事が
できるのですが、画像ファイルを添付した所、メールで受信して
画像を見ると画像が一部壊れてしまっています。(上部は大丈夫
だけど、下部にいくにつれて緑色になってたりノイズが入ったり
して化けてしまいます)
どうしたら、画像が壊れずに送れるのでしょうか?
0720nobodyさん02/04/19 20:08ID:???
>>718
HTTPのヘッダが関係あるかどうかは分からんよ。
>何故一度ログインすればその後はName/Pass無しでもログインしているとみなされるのか。
察するに、これがCookieで実現されている可能性があると俺は考えたわけだ。
これが正解なら、取得したヘッダを調べりゃ分かる。
072168902/04/19 20:41ID:???
>>707
よく分からない漏れって逝ってよしでしょうか。
072268902/04/19 20:44ID:???
>>721
分かった。
■ このスレッドは過去ログ倉庫に格納されています