Perl コーディング初心者質問コーナー Part31

このエントリーをはてなブックマークに追加
879nobodyさん:04/01/29 18:02 ID:???
>>874,876
オマエ、いいヤツだな。正直見直した。
880874:04/01/29 18:47 ID:???
残念ながら俺は>>876では無い。
>>876ワラタ
解決!
881nobodyさん:04/01/29 19:37 ID:???
$aaa =~ s/\s$//;
$aaa =~ s/\s\s$//;
$aaa =~ s/\s\s\s$//;
(略
$aaa =~ s/\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s$//;

これで 16個まで取れるようになりますた
882nobodyさん:04/01/29 20:19 ID:???
>>876
禿藁w
883nobodyさん:04/01/29 20:46 ID:???
みんな不親切だな

$aaa=~ s/\s{20}$//;

これで冗長にならなくて済むよ。20の末尾スペースを一気に取り除く技
884nobodyさん:04/01/29 20:56 ID:???
$aaa =~ s/\s$//$;
$aaa =~ s/\s\s$//$;
(略
$aaa =~ s/\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s$//$;
$aaa =~ s/\s{17}$//;
$aaa =~ s/\s{18}$//;
(略
$aaa =~ s/\s{32}$//;

32個まで対応しましすた
885nobodyさん:04/01/29 21:05 ID:???
みんな素直じゃないなぁ。ちゃんと教えてあげようよ、
その方法だと、スペースが4つの時とかにスペースが一つ残ってしまうよ。

$aaa =~ s/ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? $//;

これでスペース40個まで対応だ。
886nobodyさん:04/01/29 21:24 ID:???
みんなわかってないなぁ
$aaa =~ s/.*//;
これで何も考えないで済むよ
887nobodyさん:04/01/29 21:34 ID:???
 教えて下さい。
 アスキーアートを出力したり、改変する Perl スクリプトを
組もうとしています。使用するフォントは「MS Pゴシック 中
(12ポイント)」(IE標準) です。
 この条件下で、各文字の幅を取得する必要があるので、文字が与え
られると、その幅(ドット数)を返す関数が必要です。
 以下のような関数を作成しようとしたのですが、正直言って疲れます。
もっと「まし」な方法は無いでしょうか?
 環境はWin2000 + ActivePerl 5.8 です。
 
sub get_char_width{
shift @_;
return 3 if /.,:;'il/;
return 4 if /|!{}jjiI.,:;'il゙/;
return 5 if /()[] _f/;
     :
   (以下略)
888nobodyさん:04/01/29 22:03 ID:???
>>887
お前、Pゴシックの「P」はプロポーショナルだって事知ってて質問してるんだろうな。
それなら、HDC取得してGetTextExtentPoint32で取れ。
知らないならあきらめろ。
889nobodyさん:04/01/30 00:13 ID:???
P-chan
890nobodyさん:04/01/30 00:17 ID:???
>>889
なんでうちのハムスターの名前しってんだ?
891887:04/01/30 00:59 ID:???
>>888
とほほ...。
やっぱりそれしか無いですか。
Win API のことはよく解らないので、頑張って
get_char_width を完成させるようにしましょう。
892nobodyさん:04/01/30 09:42 ID:???
>>891
正直、WinAPI の勉強した方が「マシ」な方法だよ。
ドカタみたいなことすんな。
893nobodyさん:04/01/30 10:21 ID:YQ5dcM/M
perlでtelnetすることって出来ますか?
とりあえず、ログインして、ps -aux だけしてその結果を取得できると
いいのですが。
894nobodyさん:04/01/30 10:28 ID:r6WYD04X
hoge.shtmlとfoo.cgiがあり、
hoge.shtmlのなかに上下に2つfoo.cgiをexec cgiで呼び出す記述をし、
foo.cgiの方で、UserAgentを見て携帯電話の時とPCの時に処理を分け、
それぞれ表示させてるんですが、
携帯ユーザーの時は、上下2つあるうちの下の方は、
何も表示させないようにしたいんです。

cgiからの戻り値をssiに渡すことができるなら、
cgiから、表示させる文字列に加えて、携帯の時はフラグとして1を返し、
フラグが立ってたら下のexec cgiは実行しないような書き方をすると
出来るのではないかと思うのですが、、
何処を探してもそういうことが出来ると書かれたところを見つけられませんでした。

ssiスレを探しましたが無いようで、こちらに書かせていただきました。
何かいい方法無いでしょうか?

#ssi側でUAを判定することで下のexecをさせなくすることはできるのですが、
#cgi内でも表示させる文字列を分けるためUA判定する必要があるので、2度でまなんです
895nobodyさん:04/01/30 10:32 ID:???
つまりssiとcgiで、変数を共有、若しくは戻り値、引数として値を渡せないかということです。
896nobodyさん:04/01/30 10:32 ID:???
ここはPerlスレだ
897nobodyさん:04/01/30 10:44 ID:???
すいませんでした。CGIスレ逝きます
898nobodyさん:04/01/30 14:11 ID:???
全ての自称初心者君へ。

「Perl で何々ができますか?」系の質問する前に perlfaq 読め。
http://www.kt.rim.or.jp/%7ekbk/perl5.005/
http://perldoc.com/perl5.8.0/pod/perlfaq.html

あと、自分がやろうとしている事は大抵誰かが先にやっていると思っとけ。
そのノウハウの蓄積は CPAN にモジュールの形で置いてある。
http://search.cpan.org/
899nobodyさん:04/01/30 16:23 ID:???
質問です。
1:CGIで他のサーバに置かれた画像ファイルを読み出したい
2:open FILE, "http://hoge〜";等は無理でした
3:Net::HTTPモジュール等を使用し、一度ローカルに保存すればうまくいくらしい
 のですが、CGIですのでNet::HTTPが使えるかどうか不明。

ということで、例えば
<img src="hoge.cgi?url=http://hoge.com/piyo.png">
といった風にページに組み込んでhttp://hoge.com/piyo.pngを表示させたいので
すがどのようにすればよいでしょうか。

CGIスレとPerlスレ、どちらに書けば迷ったのですがCGIスレのほうがよければそち
らで出直してきます。
900nobodyさん:04/01/30 16:30 ID:???
>>742,>>747に近いと思うんですが、うまくいかないので聞かせて下さい。
POSTで受けた\x82\xb3 とかの文字"列"をSHIFT_JISで
表示させるにはどうすればいいですか?

print "\x82\xb3" とやれば表示できるのですが、
read(STDIN,$str,$ENV{"CONTENT_LENGTH"})で取り出した$strを
printすると、そのまんま表示されてしまいます。
901nobodyさん:04/01/30 16:33 ID:???
[Fri Jan 30 16:23:59 2004] [error] [client 127.0.0.1] malformed header from script. Bad header=<br><br><br><br><br>: test.cgi,

このエラーの原因は何でしょうか?
調べたところヘッダーが不正らしいのですが、不正なヘッダーは出力していないのです。
Perl5.6、Apache2.0.43、Windows2000です。
902nobodyさん:04/01/30 16:41 ID:???
>>899
さんざん既出の話だが、実際にあるホスト名を使うのはイクナイ。
example.comとか使おうな。

>CGIですのでNet::HTTPが使えるかどうか不明。
標準添付のモジュールでネットワーク扱えるのはIO::Socketだけじゃないかな。
しかもHTTPの面倒は自分で面倒見なくちゃいけないし。

諦めて標準添付じゃないモジュールを使うか、IO::Socketでガンガるかのどっちかだな。
必要なモジュールを一緒に添付するって手もあるが。

>>900
意味分からん。

>>901
>調べたところヘッダーが不正らしいのですが、不正なヘッダーは出力していないのです。
君の調べ方が多分間違ってる。
どうやって調べてどういう結果が得られたから、不正なヘッダじゃないと判断したのか教えてくれ。
903900:04/01/30 16:49 ID:???
すんません。
"\x82\x97" を "w"と表示させたいんですが
"\x82\x97"のまま出力されてしまいます。
904nobodyさん:04/01/30 16:51 ID:???
>>903
俺の環境では unescape しさえすればちゃんと表示されるんだがな
ひょっとして "\x80" と "%80" がごっちゃになってないか?
905nobodyさん:04/01/30 16:57 ID:???
>>899
自鯖ならモジュール突っ込む
レンタル鯖で突っ込めないなら、使えるの調べるべし
foreach(qw(LWP::Simple Net::HTTP)) {
eval("use $_;");
my($version) = '$'.$_.'::VERSION';
print "$_ : ".eval("$version;")."\n";
}
って感じで何使えるか調べられるぞ

>>900
$a = "\x82\xb3";
で変数に取り込んでからShift_JISにコンバートは?
print "\x82\x97"で w と表示されるなら取り込めると思うが・・・
906901:04/01/30 16:58 ID:???
>>902
HTMLで出力するのですが、その際には専用の関数を使って出力しています。
&Header;
print "hogehoge";
&Footer;
またエラー前後でヘッダー関連の変更は行っていません。
また<br><br><br><br><br>という出力もありません。
907nobodyさん:04/01/30 17:04 ID:???
>>906
じゃあその専用の関数がおかしいんだろ
908900:04/01/30 17:09 ID:???
>>904
いや、間違いなく\x82です。
$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;
でデコードしてるんですが、もしかするとここがマズいんでしょうか。
909900:04/01/30 17:14 ID:???
小出しにすると余計わからなくなりそうなんで、
POSTの読み取り部全部書いてみます

read(STDIN,$str,$ENV{"CONTENT_LENGTH"});

@src = split('&',$str);
foreach(@src){
($variable,$value) = split("=");
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/\r\n/\n/g;
$value =~ s/\r/\n/g;
$cgi{$variable} = $value;
}

print $cgi{"hoge"};
910nobodyさん:04/01/30 17:56 ID:???
>>909
printf ("%s", $cgi{"hoge"});
911900:04/01/30 18:01 ID:kjxlq4kM
>>910
同じです・・・。
912nobodyさん:04/01/30 18:16 ID:???
>>900

$test = "\\x82\\xb3";
while ($test =~ s/\\x([\d\w]+)//){
  $char .= chr(oct("0x$1"));
}
print "$char \n";
913nobodyさん:04/01/30 18:18 ID:LRfxaIu4
IPアドレスが書かれたファイルから一行ずつ取り出して wget http://www...[取り出したIPアドレス]
と言う風に自動でweget接続したいのですが、「while文」というのを
書けばいいのでしょうか?
なにか必要な制御文?ありましたら教えてほしいのです


====== SPAM.txt =======
61.149.25.4  --> wget http://www... を順に繰り返す
61.149.26.199
61.149.79.7
61.49.138.183...
=======================
914nobodyさん:04/01/30 18:22 ID:???
おっと。912 の2行目の \d はいらない。
915900:04/01/30 18:25 ID:???
>>912
ばっちりです、ありがとうございました。
単純に出るかと思いきや、こんな事になるとは・・・。
916nobodyさん:04/01/30 18:29 ID:???
>>902
hoge.comってあったんですね(汗
失礼しました。

>>905
ありがとうございます、モジュール使う以外に方法はないってことですね。
それで調べて使えそうならその方法で試してみます。

ありがとうございました。
917nobodyさん:04/01/30 18:48 ID:LLMKM8sm
いろんなソースを見ていると
GET : {
〜〜〜
〜〜〜〜
} #END OF GET

みたいな事が書かれてあったのですがこれはどういうことなのでしょうか?
サブルーチンでもないし、オブジェクト指向とかならパッケージ宣言しなきゃ
だめですよね?
perl初心者で大体の文法などは把握できるようになってきたのですが
これだけがどうしても分かりません。
検索しようにも:[が記号の為引っかけることができなくて・・。
よろしければ教えて頂けないでしょうか?
918nobodyさん:04/01/30 18:56 ID:???
>>917
http://www.kt.rim.or.jp/~kbk/perl5.005/perlsyn.html#Simple_statements
の下の方 LOOP: { 〜 }

perldoc とかちゃんと読んでる?
919nobodyさん:04/01/30 19:01 ID:???
>>906
content-type:text/html;
を吐いてる?
920nobodyさん:04/01/30 19:11 ID:???
>>913
wgetにfile読み込みのオプションがあるはず。
--base=URLと組み合わせて使う。 例) wget --base=http://example.com/ -i url.list
921nobodyさん:04/01/30 20:06 ID:???
>899
著作権法違反。
922nobodyさん:04/01/30 20:11 ID:???
>>891
Win32::GUIパッケージのWin32::GUI::FontにGetTextExtentPoint32があるよ。
# 使い方がサパーリ分からなかった。。

>>900
print eval qq{"$str"};

>>901
以前、ヒアドキュメント使っていたら、何かのエラーで出た記憶が。
答えじゃなくてごめん。
923nobodyさん:04/01/30 21:18 ID:???
>>918
perldocは読んでませんでした。
ありがとうございました。
紹介して頂いたHPやラベルとブロックと言う単語を頼りに
検索することで理解できました。
これからはperldocを熟読していこうと思います。
924900:04/01/30 21:22 ID:???
>>922
まだ理解できていませんが、表示が一発なのは確認できました
ありがとうございます。
925899:04/01/30 21:41 ID:???
>>921
どこがどう著作権法違反なのでしょうか。
CGIの想定動作としては、サーバA上のページからサーバB上のCGIを呼び出したときに、
サーバA上の画像ファイルを表示させるといったものなのですがどこかまずかったでしょ
うか?

そして>>899の問題はuse Socket使うことで解決しました。
アドバイスをくれた方、改めてありがとうございました。
926nobodyさん:04/01/30 21:52 ID:???
>925
自分の画像なら問題ないよ。
自分の画像なら別鯖に置く必要性をあまり感じないけどね。
負荷と転送量を増やすだけだし。
927899:04/01/30 22:08 ID:???
>>926
それは大丈夫…だと思いますが利用者のモラルに任せるしかないですね。
ありがとうございました。
928912
>>922
> print eval qq{"$str"};

 素晴らしい!目が覚めるようです。