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
0276275
03/07/06 19:51ID:???まちがった
0277nobodyさん
03/07/06 19:54ID:???なんか、メチャクチャだな…。
ひょっとして @chk に見つかった行を格納したいのか?
ち ゃ ん と 期 待 し た い 結 果 を 明 記 し て く だ さ い
で、俺ならこうする
# @chk にヒットした行番号を格納
# 検索対象は $name
# $[ を 0 と仮定する
$i = $j = 0;
foreach ( @DATA ) {
if ( $_ eq $name ) {
$chk[ $i++ ] == $j;
}
++$j;
}
0278267
03/07/06 19:55ID:AvDpfWTIありがとうございます。それでやってみたのですがやはり -1 のままでした。。
0279nobodyさん
03/07/06 20:00ID:???/$name/
↑これで OK ってオチじゃねーだろーなぁ?
$_ eq $name は「完全に一致」ってこと解ってる? >>267
0281nobodyさん
03/07/06 20:02ID:???で、$nameが含まれてるものを知りたいんだろう?
$chk[$i] eq $name じゃなくて、マッチ演算子使うとか・・・
$KEKKA = $DATA[$i] =~ m/$name/;
0282267
03/07/06 20:08ID:AvDpfWTI$chkに一旦格納したものを$nameと比較して一致なら$foundに行数を格納というつもりでした。
277さんの方法でやってみてもだめでした・・
どこかおかしくて微妙に完全一致してないのかとも考えたのですがそうでもないような
気もしたりします。
ちょっと今から出かけますすみません・・・
0283nobodyさん
03/07/06 20:16ID:???あと、$found はマッチした行数のことか?
# [廃止] @chk にヒットした行番号を格納
# 検索対象は $name で完全一致
# $found にはマッチした行数が入る。0ならマッチなし
# $[ を 0 と仮定する
&jcode'convert( *DATA, 'sjis' );
$found = 0;
foreach ( @DATA ) {
chop ; # 行末の \n を削除
++$found if ( $_ eq $name ) ;
}
0284あぼーん
NGNG0285nobodyさん
03/07/06 21:34ID:???if($chk[$i] eq $name){
を
print "!$chk[$i]!=!$name!"; ←文字列の両端に何か文字入れてprint
if($chk[$i] eq $name){
にしてやってみろ。多分分かる。
0286nobodyさん
03/07/06 21:35ID:???print "!$chk[$i]!=!$name!"; ←文字列の両端に何か文字入れてprint
を
print "!$chk[$i]!=!$name!\n"; ←文字列の両端に何か文字入れてprint
に変えてくれ。
0287nobodyさん
03/07/06 21:55ID:???とにかく$chk[$i]があやしいことだけは確か
0288nobodyさん
03/07/07 01:00ID:???0289267
03/07/07 01:07ID:kYkAMaKH0290267
03/07/07 01:29ID:kYkAMaKHよく見たら改行が入っていました。おれの変なソースをわざわざ見ていただき
みなさんありがとうございました。
こういう風にしました
$count = @DATA;
$i = 0;
$found = -1;
while($i<$count){
($chk[$i]) = ($DATA[$i]);
$chk[$i] =~ s/\n//g;
if($chk[$i] eq $name){
$found = $i + 1;
}
$i ++;
}
かなり下手なやり方なんだろうと思いますが許してくださいごめんなさい・・
0291267
03/07/07 01:29ID:???0292nobodyさん
03/07/07 01:31ID:???↓次に質問
0293nobodyさん
03/07/07 01:36ID:???0295nobodyさん
03/07/07 01:40ID:???大体、$chk って何のためのデータよ?
データをやたらコピーとかするからおかしくなったり混乱したりするんだよ。
変更しないデータならコピーして使うなよ
0296nobodyさん
03/07/07 01:42ID:???0297267
03/07/07 02:51ID:???0298wakaba
03/07/07 08:49ID:rYaKDTZH環境
FreeBSD
perl version 5.005_03
ImageMagick、GD、インストール済
ImageMagick、GDとも、基本的なコマンドが使えるのは確認済
自分的にやってみた方法
1)レンタルサーバ管理会社に
日本語TrueTypeFontのインストールを依頼。
-> ports で ja-truetypefont をインストール完了。
2)サーバを検索し、インストールされた日本語ttf は
/usr/X11R6/lib/X11/fonts/TrueType/wadalab-gothic.ttf
/usr/X11R6/lib/X11/fonts/TrueType/watanabe-mincho.ttf
であろうと見当を付る。
0299wakaba
03/07/07 08:50ID:rYaKDTZH3)下記のようなスクリプトを作成、実行。
$imagemagick = Image::Magick->new;
$infile = "/hogehoge/infile.gif";
$outfile = "/hogehoge/outfile.gif";
$imagemagick->Read($infile);
$text = Jcode::convert('日本語を描画する試験','sjis');
$imagemagick->Annotate(font=>'/usr/X11R6/lib/X11/fonts/TrueType/watanabe-mincho.ttf', pointsize=>18, fill=>'green', text=>$text, x=>20, y=>100 );
$image->Write($outfile);
4)結果
エラーは出ませんが、日本語が文字化けして描画されています。
別にImageMagickやGDを使わなくても良いです。
何か良い解決策をご存知の方はいらっしゃいますでしょうか?
0300nobodyさん
03/07/07 09:20ID:???それよりも、ImageMagick は日本語対応してるの?
300 GET ⊂(゚Д゚⊂⌒`つ≡≡≡(´⌒;;;≡≡≡
0301nobodyさん
03/07/07 10:02ID:???Jcodeの使い方おかしいんじゃない?
レガシースタイルでconvert使うならjcode.plと同じだよね。
スカラで受けた場合は変換した結果ではなく、変換した文字コードが
戻り値だし、第一引数がそれだと何も返ってこない。
$text = '日本語を描画する試験';
$text = jcode::convert(\$text, 'sjis');
print $text;
出力 sjis
$text = jcode::sjis( '日本語を描画する試験');
print $text;
出力 日本語を描画する試験
手元にJcode.pm入ってるのなくてjcode.plでやったんだけど。
0302wakaba
03/07/07 10:25ID:rYaKDTZH>300 さんへ
ImageMagick の日本語対応の件は不明です。
レンタルサーバに問い合わせました。
>301 さんへ
$text = Jcode::convert('日本語を描画する試験','sjis');
は確かにレガシー記法ですが、当サーバでテキスト処理は出来ています。
しかし、念のためOOPで
$text = Jcode->new('日本語を描画する試験')->sjis;
のように文法を変え、
300さんの指摘通りjis、euc、utf8と確認しましたが
全て文字化けしました。
0303nobodyさん
03/07/07 10:34ID:???Jcode.pmはconvert($text, $encoding)のような書き方にも対応してるが
0304nobodyさん
03/07/07 10:43ID:???0305nobodyさん
03/07/07 10:54ID:???違うのはわかるけど、マニュアルに
Jcode::convert($str, [$ocode, $icode, $opt]);
jcode.pl Users: This function is 100% upper-conpatible with jcode::convert() !
こう書いてあったからjcode.plでやってみただけ
0306nobodyさん
03/07/07 11:00ID:???昔、knj2gifというCのソースを配ってる方がいらっしゃいましたが、
もう配布をやめちゃってるようです。10年くらい前の話ですが・・・。
少なくともImageMagickで日本語化に成功してる人はいるので、
何かしら設定ミスがあると思うのですが。
>>305
「Upper-Compatible」ってのは、
「jcode.plのスタイルで書いてもエラーを起こさない」
だけで、
「jcode.plのスタイルでエラーならJcode.pmのスタイルでもエラー」
って意味じゃない。
どうでもいいけど、こがいさん「compatible」の綴り間違えてるね>ドキュメント
0307nobodyさん
03/07/07 12:18ID:???"bukken" => "EUCの文字",
"basyo" => "EUCの文字",
"comment" => "EUCの文字",
};
$houselist[1] = {
"bukken" => "EUCの文字",
"basyo" => "EUCの文字",
"comment" => "EUCの文字",
};
$houselist[2] = {
"bukken" => "EUCの文字",
"basyo" => "EUCの文字",
"comment" => "EUCの文字",
};
っていうリファレンスの、「EUCの文字」という部分を、
jcode.plを使って全部sjisにしたいのですが、
どのようにすればいいのでしょうか?
for ($i=0;$i<=$#houselist;$i++){
#この部分が不明です・・・・
}
0310307
03/07/07 15:15ID:???とすると、hosuelistの中身がまったくなくなってしまうのですが・・・
(&jcode::convert(*houselist, 'sjis' ); の1行をコメントアウトすると、
文字化けした状態で表示されます)
(ちなみに、HTML:Template のLOOP使って表示させてます)
0311nobodyさん
03/07/07 15:21ID:???例えば(.*)は$1で取り出せる?訳ですが、
これを一度に複数扱う場合はどうすれば良いのでしょうか?
(.*)(.*)とあった場合は$1,$2って具合で良いのですか?
判り難いかもしれませんがお教え下さい。
0312wakaba
03/07/07 15:35ID:rYaKDTZH>304 さんへ
レンタルサーバ管理会社に
Ports の japanese/gd で GDが日本語化するか確認してみます。
ただ、GIFを使用したいので、
現在GDはあえてversionの古いものを使用しています。
(最新版のGDはGIFが使用出来ない、とのことでしたので。)
よってGDは今回の目的で使用出来ない可能性が高いです。
>306 さんへ
Cは当方よく解らないので、当座の解決として難かしいものがあります。
ImageMagickで日本語化に成功している人がいる、とのことですので、
レンタルサーバ管理会社にImageMagickの設定を再度チェックさせる方針で
臨んでみます。
みなさんどうもありがとうございました。
また解決しましたら、顛末を記入させて頂きます。
0314wakaba
03/07/07 15:58ID:rYaKDTZH盲人が盲人の手を引くようで気がひけますが。。。
foreach(@houselist){
jcode::convert(\$_->{bukken} , 'sjis' );
jcode::convert(\$_->{basho} , 'sjis' );
jcode::convert(\$_->{comment}, 'sjis' );
}
これで変換されませんか?
0315nobodyさん
03/07/07 15:58ID:???ほい。
jcode::convert(\$houselist[$i]->{$_}, 'sjis') foreach (keys %{$houselist[$i]});
自分なら、ハッシュに展開する前か、表示する直前(フォーマットを整えてから)に
変換するけどね。
0317nobodyさん
03/07/07 16:39ID:???12345678 を、12,345,678 に変換するにはどうすればいいのでしょうか?
0318nobodyさん
03/07/07 16:41ID:???コシキタソですか?
まぁいいですが、、る
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 では勝手に間引きしたり、追加されたりするものと理解していいのでしょうか?
■ このスレッドは過去ログ倉庫に格納されています