Perl コーディング初心者質問コーナー Part31
>>874,876
オマエ、いいヤツだな。正直見直した。
880 :
874:04/01/29 18:47 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個まで取れるようになりますた
みんな不親切だな
$aaa=~ s/\s{20}$//;
これで冗長にならなくて済むよ。20の末尾スペースを一気に取り除く技
$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個まで対応しましすた
みんな素直じゃないなぁ。ちゃんと教えてあげようよ、
その方法だと、スペースが4つの時とかにスペースが一つ残ってしまうよ。
$aaa =~ s/ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? $//;
これでスペース40個まで対応だ。
みんなわかってないなぁ
$aaa =~ s/.*//;
これで何も考えないで済むよ
教えて下さい。
アスキーアートを出力したり、改変する 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/;
:
(以下略)
>>887 お前、Pゴシックの「P」はプロポーショナルだって事知ってて質問してるんだろうな。
それなら、HDC取得してGetTextExtentPoint32で取れ。
知らないならあきらめろ。
P-chan
>>889 なんでうちのハムスターの名前しってんだ?
891 :
887:04/01/30 00:59 ID:???
>>888 とほほ...。
やっぱりそれしか無いですか。
Win API のことはよく解らないので、頑張って
get_char_width を完成させるようにしましょう。
>>891 正直、WinAPI の勉強した方が「マシ」な方法だよ。
ドカタみたいなことすんな。
893 :
nobodyさん:04/01/30 10:21 ID:YQ5dcM/M
perlでtelnetすることって出来ますか?
とりあえず、ログインして、ps -aux だけしてその結果を取得できると
いいのですが。
894 :
nobodyさん: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度でまなんです
つまりssiとcgiで、変数を共有、若しくは戻り値、引数として値を渡せないかということです。
ここはPerlスレだ
すいませんでした。CGIスレ逝きます
>>742,
>>747に近いと思うんですが、うまくいかないので聞かせて下さい。
POSTで受けた\x82\xb3 とかの文字"列"をSHIFT_JISで
表示させるにはどうすればいいですか?
print "\x82\xb3" とやれば表示できるのですが、
read(STDIN,$str,$ENV{"CONTENT_LENGTH"})で取り出した$strを
printすると、そのまんま表示されてしまいます。
[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です。
>>899 さんざん既出の話だが、実際にあるホスト名を使うのはイクナイ。
example.comとか使おうな。
>CGIですのでNet::HTTPが使えるかどうか不明。
標準添付のモジュールでネットワーク扱えるのはIO::Socketだけじゃないかな。
しかもHTTPの面倒は自分で面倒見なくちゃいけないし。
諦めて標準添付じゃないモジュールを使うか、IO::Socketでガンガるかのどっちかだな。
必要なモジュールを一緒に添付するって手もあるが。
>>900 意味分からん。
>>901 >調べたところヘッダーが不正らしいのですが、不正なヘッダーは出力していないのです。
君の調べ方が多分間違ってる。
どうやって調べてどういう結果が得られたから、不正なヘッダじゃないと判断したのか教えてくれ。
903 :
900:04/01/30 16:49 ID:???
すんません。
"\x82\x97" を "w"と表示させたいんですが
"\x82\x97"のまま出力されてしまいます。
>>903 俺の環境では unescape しさえすればちゃんと表示されるんだがな
ひょっとして "\x80" と "%80" がごっちゃになってないか?
>>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 と表示されるなら取り込めると思うが・・・
906 :
901:04/01/30 16:58 ID:???
>>902 HTMLで出力するのですが、その際には専用の関数を使って出力しています。
&Header;
print "hogehoge";
&Footer;
またエラー前後でヘッダー関連の変更は行っていません。
また<br><br><br><br><br>という出力もありません。
908 :
900:04/01/30 17:09 ID:???
>>904 いや、間違いなく\x82です。
$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;
でデコードしてるんですが、もしかするとここがマズいんでしょうか。
909 :
900: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"};
>>909 printf ("%s", $cgi{"hoge"});
911 :
900:04/01/30 18:01 ID:kjxlq4kM
>>900 $test = "\\x82\\xb3";
while ($test =~ s/\\x([\d\w]+)//){
$char .= chr(oct("0x$1"));
}
print "$char \n";
913 :
nobodyさん: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...
=======================
おっと。912 の2行目の \d はいらない。
915 :
900:04/01/30 18:25 ID:???
>>912 ばっちりです、ありがとうございました。
単純に出るかと思いきや、こんな事になるとは・・・。
>>902 hoge.comってあったんですね(汗
失礼しました。
>>905 ありがとうございます、モジュール使う以外に方法はないってことですね。
それで調べて使えそうならその方法で試してみます。
ありがとうございました。
917 :
nobodyさん:04/01/30 18:48 ID:LLMKM8sm
いろんなソースを見ていると
GET : {
〜〜〜
〜〜〜〜
} #END OF GET
みたいな事が書かれてあったのですがこれはどういうことなのでしょうか?
サブルーチンでもないし、オブジェクト指向とかならパッケージ宣言しなきゃ
だめですよね?
perl初心者で大体の文法などは把握できるようになってきたのですが
これだけがどうしても分かりません。
検索しようにも:[が記号の為引っかけることができなくて・・。
よろしければ教えて頂けないでしょうか?
>>906 content-type:text/html;
を吐いてる?
>899
著作権法違反。
>>891 Win32::GUIパッケージのWin32::GUI::FontにGetTextExtentPoint32があるよ。
# 使い方がサパーリ分からなかった。。
>>900 print eval qq{"$str"};
>>901 以前、ヒアドキュメント使っていたら、何かのエラーで出た記憶が。
答えじゃなくてごめん。
>>918 perldocは読んでませんでした。
ありがとうございました。
紹介して頂いたHPやラベルとブロックと言う単語を頼りに
検索することで理解できました。
これからはperldocを熟読していこうと思います。
924 :
900:04/01/30 21:22 ID:???
>>922 まだ理解できていませんが、表示が一発なのは確認できました
ありがとうございます。
925 :
899:04/01/30 21:41 ID:???
>>921 どこがどう著作権法違反なのでしょうか。
CGIの想定動作としては、サーバA上のページからサーバB上のCGIを呼び出したときに、
サーバA上の画像ファイルを表示させるといったものなのですがどこかまずかったでしょ
うか?
そして
>>899の問題はuse Socket使うことで解決しました。
アドバイスをくれた方、改めてありがとうございました。
>925
自分の画像なら問題ないよ。
自分の画像なら別鯖に置く必要性をあまり感じないけどね。
負荷と転送量を増やすだけだし。
927 :
899:04/01/30 22:08 ID:???
>>926 それは大丈夫…だと思いますが利用者のモラルに任せるしかないですね。
ありがとうございました。
928 :
912:
>>922 > print eval qq{"$str"};
素晴らしい!目が覚めるようです。