Perlコーディング初心者質問スレ Part 48
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/04/26(水) 18:00:50ID:RLbnve1J【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0583nobodyさん
2006/05/18(木) 21:40:24ID:???0584nobodyさん
2006/05/18(木) 21:45:10ID:???map {print qq|<OPTION value="$_">$_</OPTION>\n|} (1..10);
print '</SELECT>',"\n";
0585nobodyさん
2006/05/18(木) 21:49:32ID:???>>573さんのようにPerlだからでこその記述の仕方ではないけど・・・
print "<select name=\"color\">\n";
for(1..10){
print "<option value=\"$_\">$_</option>\n";
}
print "</select>\n";
>>579
普通に感動
すごいなそれ
0586nobodyさん
2006/05/18(木) 21:55:03ID:???0587nobodyさん
2006/05/18(木) 22:13:29ID:???Perlで他のサイトを取得して表示したいと思っています。
(著作権侵害とかそういうことをしたいのではないです)
お時間のある方にお願いしますが、次のコードで@niftyのトップページを取得してみたら
どうなるか教えていただけませんでしょうか?
print "Content-Type: text/html\n";
print "\n";
use LWP::Simple;
print get( 'http://www.nifty.com/' );
私のところだと、ブラウザ上での表示がぐちゃぐちゃになるんですが…。
0588nobodyさん
2006/05/18(木) 22:33:05ID:???こいつ他のスレ荒らした奴だから構わないでね。
http://pc8.2ch.net/test/read.cgi/tech/1146022352/
0590nobodyさん
2006/05/18(木) 22:50:45ID:???応接するメンツはそれほど変わらんと思うけど。w
>>587
その質問に対する答えなら、「試しちゃいないけど、たぶん僕んとこでも同じです」だね。
でな、ひとつ提案なんだけれど、「やりたいこと」、「試したこと」、「その結果」をそれぞれ正しく伝わるように書いてみませんか。
「どうなるはずだと思ったか」を書かずに、単に「どうなるか」と問われても、「書いた(コード)なり」、としか答えられませんし、
また「ぐちゃぐちゃ」が実際にどういった現象を指しているのか、そしてそれはあなたの狙いとどう食い違っているのか、そのあたりは最低限明記しなくては有益な議論になりません。
0591nobodyさん
2006/05/18(木) 22:50:56ID:???0592nobodyさん
2006/05/18(木) 22:52:19ID:???http://oshiete1.goo.ne.jp/kotaeru.php3?q=2143752
0593nobodyさん
2006/05/18(木) 22:58:57ID:???マルチしてる池沼は以後放置
0594587
2006/05/18(木) 23:02:26ID:???ありがとうございます。
■やりたいこと:
Perlスクリプトから任意のページを取得する
(丸ごとゲットしたいわけではなく、ブラウザで表示するだけ)
■試したこと:
>>587のようなコード(socket関係、LWPモジュール関係)
■結果:
指定したページは取得できているけれど、相対パス指定の画像や外部ファイルが
読み込めていないため、スタイルシートに依存しているページなどでは
表示がぐちゃぐちゃになる
■「ぐちゃぐちゃ」とは:
スタイルシートに依存しているページなどをオフラインで見た時のようなイメージ
■私の狙いとどう食い違っているのか:
私は、スクリプトにアクセスすると、スクリプトが指定したページを取得してきて
それをブラウザに返し、そこからブラウザがリンクを解析して画像などを読み込んでくると
思っていました。
でも、絶対パスの画像などは読み込まれてきますが、相対パスのものが
全く読み込まれません。
これって普通なんでしょうか?
0598nobodyさん
2006/05/18(木) 23:05:59ID:???0599nobodyさん
NGNG0600587 ◆AOxf8.Tmck
2006/05/18(木) 23:06:32ID:???つけてないのは偽者です。
0601nobodyさん
2006/05/18(木) 23:07:16ID:???>これって普通なんでしょうか?
それで正しい動作。あまりに普通。
ソース解析して中身まで持って来たりはしない。
0602nobodyさん
2006/05/18(木) 23:07:40ID:???呆れたってよりも可哀想だ…
0605587 ◆AOxf8.Tmck
2006/05/18(木) 23:09:21ID:???そうなんですか…。どうもありがとうございます。
それでは、相対パスの画像なども読み込まれるようにするには、
どうコーディングすればいいんでしょうか?
0607nobodyさん
2006/05/18(木) 23:10:35ID:???>ググっても解決しませんでしたが。
何て検索したか言ってみろ
俺のディスプレイには解答への検索結果が出てるが
0608nobodyさん
2006/05/18(木) 23:10:48ID:???丸ごと以上にゲットしなきゃだと思う。。。@HTMLを解釈して必要な物を再度取得する。
ブラウザってば、普通の人にはなんの変哲もない事をやっているように見えるけれども、
中の人はほんと大変なんだけどなぁ。。。
0610587 ◆AOxf8.Tmck
2006/05/18(木) 23:14:01ID:???すいません忘れました。
>>608
エスパー機能でなくても、例えばニフティのトップだったら
ブラウザに「http://www.nifty.com/」というURLを与えてやれば、
そこから相対パスをブラウザ内部で絶対パスに変換することはできると思います。
0611nobodyさん
2006/05/18(木) 23:15:17ID:???0612587 ◆AOxf8.Tmck
2006/05/18(木) 23:15:46ID:???「@HTML」って何ですか?
ググっても「@」という記号が無視されるようで、検索できませんでした。
0613nobodyさん
2006/05/18(木) 23:15:49ID:???該当するページのソースを丸ごと取得してから、ソースを解釈して<img src="uri">などの"uri"からリソースを再度取得し、
ローカル内に再配置する。それからそれから(長いので省略)
という意味です。
0617nobodyさん
2006/05/18(木) 23:20:50ID:???0619587 ◆AOxf8.Tmck
2006/05/18(木) 23:22:25ID:???…ということは、ブラウザと同じようなものを作るしかないということなんですね。
どうもありがとうございました。
0622nobodyさん
2006/05/18(木) 23:32:08ID:???0623nobodyさん
2006/05/18(木) 23:34:44ID:???0626nobodyさん
2006/05/18(木) 23:57:46ID:???早 /::::l:::l::、:::::、:::::ヽ::、::::::::::::\:::\::::::::ヽヽ::::::ヽ 駄
.く /:::!::::i:::!:::ヽ:::ヽ::::::ヽ::ヽ、::::::::::\:::ヽ:::::::ヽヽ::::::', 目
な. /:l::::!::::ヽ!::ヽ:::::::ヽ:::::::\:::ヽ、::::::::ヽ:::ヽ::::::::!::i:::::::! だ
ん ハ:::l:::::、::::ヽ::::\:::::\:::::::\:::`ヽ、:::ヽ::ヽ:::::!:::!:::::l
と /:::::::l::::::!ヽ:ヽ::::、:::::ヽ:::、:\::::: \::::::\::::!::::ヽ:!:::i:::l:l こ
か !:/!:::::!::::::!::ヽ:ヽ{:::\:::ヽ::::\:::\::ヽ:::::::ヽ!:::::::}!::::l::li| い
し j/:::l:::::!:、:::!::ト、:、:ヽ:::::`ヽ{、::::::\::::\{、::::::::::::::::i::!::l:l ! つ
な l:i:l::::i::i:、:l::lテ=-、:ヽ、_、::\_,≧ェュ、_、\:::::::::i::li::!::リ :
い !ハト:{:!:i:トN{、ヒ_ラヘ、{ >、{ 'イ ヒ_ラ 》\::l::!:ト!!:l::l! :
と ヽ i、ヽ:ト{、ヾ ̄"´ l!\ `" ̄"´ |::!:l::! j:ll:!
: !::、::::i l u |:::/lj/l:!リ
: ヾト、:!u j!/ j|:::リ
ヾ! ヽ ‐ u /イ´lハ/
}ト.、 -、ー-- 、__ /' !:://
リl::l゛、 `二¨´ / |/:/
rー''"´ト!::i{\ / / !:/
/ ^ヽ ヾ! ヽ _,,、'´ / j/
EOF
0627nobodyさん
2006/05/18(木) 23:59:24ID:???誰か教えてくださいよ〜。
0628nobodyさん
2006/05/19(金) 00:27:46ID:???意地悪で言うんじゃないからちゃんと読んでね。
お前さんがそこそこ腕の立つ医者だったとしようや。
患者がやってきて、
「病院に通ってるのに病気が治らないんですけど」
って言うんだ。
僕たちは商売でもないのに、毎度基礎的な事実関係を優しく問診してあげるところからスタートしなくちゃいけないかい?
問題解決に興味があっても(だから僕たちはここにいるんだけど)、問題が何なのかわからなくちゃどうしようもないんだ。
0629543です
2006/05/19(金) 00:27:52ID:1sSf/5KFhtmlからデータを送信しなかった場合(cgiを呼び出しただけ)ではGETが入っていました。
>>544 試してみたら簡単でした
>>547 日本語を学んでください
>>548 ありがとうございました
>>551 GETでした
>>552 わざわざソースまでありがとうございました
>>553 意味がわからなかったです・・・
>>554 正解でした
>>556 病院に行ってください
さんきゅーみんな!さんきゅーな!!
0631nobodyさん
2006/05/19(金) 09:16:12ID:???漢字を含むファイルの読み書きをする決定的な方法はないでしょうか?
どうもパスやファイル名だけがUTF-8になってしまう妙な不具合(仕様)が
あるようなので困っています。
0633nobodyさん
2006/05/19(金) 09:40:07ID:???読み書き以外の操作に関しては入出力レイヤのような便利(?)な仕掛けはないので
自分でencodeしないとだめだという仕様。
0635nobodyさん
2006/05/19(金) 10:51:24ID:???0636nobodyさん
2006/05/19(金) 11:23:42ID:???0637574
2006/05/19(金) 12:14:00ID:???ちょっくら真剣に勉強してきます orz
0638nobodyさん
2006/05/19(金) 14:58:40ID:JIoPGZWV・・・ or error("×××失敗: $!");
のようになっているのですが、サーバー(Linux)の設定が
eucのため $! もeucになり、文字化けしてしまいます。
$! を使った箇所はたくさんあるため、1つ1つ
・・・ or error("×××失敗: " . decode("euc-jp", $!));
のように変更するのは避けたいのですが、簡単に
解決する方法はあるでしょうか。
※スクリプトの文字コードやサーバーの設定は変えられません。
何かいい方法がありましたらご教授下さい。
よろしくお願いします。
0639nobodyさん
2006/05/19(金) 15:51:40ID:???仕事で IT 土方やってるなら、地面を掘るほうの土方に転職する。
0640nobodyさん
2006/05/19(金) 16:07:23ID:???普通はスクリプトで全て設定できる。
0641nobodyさん
2006/05/19(金) 16:10:56ID:4aaheppT0642nobodyさん
2006/05/19(金) 16:16:43ID:???通常ユニコード文字列とバイト文字列をつなげるときにバイト文字列はlatin-1としてdecodeされるが、
これはencodingプラグマで変更することができる。
したがってバイト文字列な$!をeuc-jpとしてdecodeするように
use encoding "euc-jp";
としてやればいけるはずだ。ただ他の部分にも影響するから注意。
一応動作確認:
use utf8;
use encoding 'euc-jp';
open F, "</hogehoge" or die "ほげほげ: $!";
というプログラムをutf8でセーブして
% LANG=ja_JP.eucJP perl foo.pl 2>&1 | hex
0x00000000: e3 81 bb e3 81 92 e3 81 - bb e3 81 92 3a 20 e3 81 ..祉....祉..: ..
0x00000010: 9d e3 81 ae e3 82 88 e3 - 81 86 e3 81 aa e3 83 95 ...�.......�..
0x00000020: e3 82 a1 e3 82 a4 e3 83 - ab e3 82 84 e3 83 87 e3 ..<.ゃ.�......
0x00000030: 82 a3 e3 83 ac e3 82 af - e3 83 88 e3 83 aa e3 81 .c.�.�....�.
0x00000040: af e3 81 82 e3 82 8a e3 - 81 be e3 81 9b e3 82 93 �.......障.....
0x00000050: 20 61 74 20 66 6f 6f 2e - 70 6c 20 6c 69 6e 65 20 at foo.pl line
0x00000060: 34 2e 0a - 4.J
0644643
2006/05/19(金) 17:02:27ID:???そゆことなら error() の定義を書き換えるか、オーバーライドしてしまえば最小限の修正で済むんでないかな、と。
0645nobodyさん
2006/05/19(金) 17:08:17ID:???どんな状況でどんな理由なのだろうか
0646638
2006/05/19(金) 18:34:56ID:???>>640
TeraTermというソフトでサーバーにアクセスすると文字コードがeucとなっているので、
そのことを伝えたくて書きました。私自身が分かっていないまま書いてしまい申し訳ありません。
>>642
頂いたテストコードでうまく行くのは確認できました。しかし、いろいろテストしてみましたところ、
use utf8;
use encoding 'euc-jp';
eval { open FH, "hoge" or die $! };
if ($@) {
print "エラー: $@";
}
のような感じにすると、なぜか文字列全体がeucになってしまいました。
また、
> 他の部分にも影響するから注意
の「影響」も分かっていない状態で使うのは、何か問題が起きた際にどうしようもなくなって
しまうため、せっかくのところ申し訳ないのですが別の方法を探そうと思います。
>>644
error("utf8文字列 eucの$!") という具合なので、error に渡った時にはもう文字コード混在
状態なのです。それを判断して変換できればその方法が一番よいように思うのですが、
$! の組み込まれ方も様々でして、私ではどうにもできませんでした。
>>645
既に稼動状態にあるものを引き継いだため、大きな影響が出そうなことはできないのです。
0647nobodyさん
2006/05/19(金) 18:39:44ID:???oioi
0648nobodyさん
2006/05/19(金) 18:56:31ID:???英語になるので文字化けからは解放される。
0649nobodyさん
2006/05/19(金) 19:27:02ID:???いくつか質問。
1.それはCGIの類なのか、ただのスクリプトなのか、何なのか
2.見るのに使うソフトウェアはブラウザなのか端末ソフトなのか何なのか
3.見たいものはログファイルなのか、スクリプトの出力なのか、何なのか
0652nobodyさん
2006/05/19(金) 19:46:29ID:???無くても平気?
無くても平気だけれども、正確に日本時刻を取得したいのならば(locale依存)
$ENV{TZ}を待避させてから'JST-9'を入れてあげるといいと思うそ。
0655638
2006/05/19(金) 21:06:17ID:???ログが英語になるのはまったく問題ないのですが、
それはどこの設定を変えればよいのでしょうか。
>>649
1.CGIやバッチ処理を行うスクリプトなど様々です。
2.ログは端末ソフト上で見たり、ダウンロードして秀丸で見たりします。
3.エラーは通常ログファイルに出力されますが、ちょっとした確認は標準出力したりしています。
>>650
$ENV{LANG} = 'euc-jp'; を追加してみても直りませんでした。
あ、そうか。。。
だったら、>639かな♪
0657nobodyさん
2006/05/19(金) 21:37:00ID:???起動する前にあらかじめ環境変数LC_MESSAGESにCを設定しておくか、perlの中だけでやりたければ
POSIX::setlocaleを使う。後者の例はperldoc perllocale参照。
0658638
2006/05/19(金) 23:07:44ID:???ありがとうございます。スクリプトの先頭で
use POSIX;
POSIX::setlocale(LC_MESSAGES, "C");
とすることで、エラーメッセージが英文になりました。
大変勉強になりました。
0659nobodyさん
2006/05/19(金) 23:50:07ID:???0660nobodyさん
2006/05/20(土) 01:08:01ID:???自前のスクリプトが吐く文字コードがUTF8で、
ターミナルの文字コードをUTF8にしておくで解決したのかな。
0662nobodyさん
2006/05/20(土) 17:53:08ID:???if ( $url =~ /\.html$/ or $url =~ /\.html\#/ )
これをもっと簡単に書くことはできませんか?
0663nobodyさん
2006/05/20(土) 17:58:29ID:???0664nobodyさん
2006/05/20(土) 18:57:30ID:???0665nobodyさん
2006/05/20(土) 19:00:35ID:???$wday = ('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday') [$wday];
という箇所があったのですが、この配列(?)のケツに付いている「[$wday];」って何でしょうか?
調べてもまったく出てこなくて・・・・・・
0666nobodyさん
2006/05/20(土) 19:04:52ID:???@aho = (3,4,3); $aho[1] eq 4 みたいに配列の要素へアクセスするときはブラケットの中に数字を入れる。
0667nobodyさん
2006/05/20(土) 19:18:42ID:???失礼。もう1ついいですか。
配列は「@wday」と書くものだとずっと思っていたのですが、ここでは「$wday」となっています。
これはどういった意味があるのでしょうか?
また、>>665はどういった処理をしているのでしょうか?
何度も申し訳ないです。。。。 よろしくお願いします。
0669nobodyさん
2006/05/20(土) 19:52:35ID:???それの$wday番目の要素を$wdayに代入
0671nobodyさん
2006/05/20(土) 20:10:52ID:???0672nobodyさん
2006/05/20(土) 21:04:01ID:???これ↓はリストを配列に代入。
@wday = ('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');
個々の配列要素にアクセスするときは、@ → $にする。なぜなら個々の要素は普通の値(もしくは文字)だから。
@だと配列全体を表すことになる。
$a = $wday[2]; # (0から数えて)2番目の要素である Tuesday を $a に代入
print $a; # Tuesday と表示
これ↓だと先述したリストを一旦、配列に入れるというのをぶっとばして、いきなりリストの2番目の要素に
アクセスしている。
('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday')[2]
すなわち、その値は、Tuesday という文字。
下の代入は、まず$wdayには数字が入っていて、リストの何番目の要素を取り出すかを決めている。
例えば、$wdayに2が入っていれば、Tuesday が選ばれたことになる。そしてその Tuesday を$wdayに代入している。
$wdayは最初、数字だったのがこれにより文字列になるわけですね。
$wday = ('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday') [$wday];
# Exchange_Date(mode, unixtime)
# mode が 'jp' の時には日本語で返す。
# unixtime time(3)の値。
sub Exchange_Date{
my $mode = shift;
my @date = localtime shift;
@date = (
$date[5] + 1900,
('01' .. '12')[$date[4]],
$date[3],
qw(Sun Mon Tue Wed Thu Fri Sat 日 月 火 水 木 金 土)[$date[6] + ($mode eq 'jp' ? 7 : 0)],
$date[2],
$date[1],
$date[0]
);
return $mode eq 'jp'
? sprintf qq|%04d年%02d月%02d日(%s) %02d時%02d分%02d秒|, @date
: sprintf qq|%04d/%02d/%02d(%s) %02d:%02d:%02d|, @date
;
}
みたいな♪
0674nobodyさん
2006/05/20(土) 22:29:16ID:???こんなの(いくら初心者っつったって)前後の流れを見れば分かることだし
分からないようならPerlに限らずどんな言語だって身に付かないと思うよ。
甘やかすのと手助けするのは全然違う。
0675nobodyさん
2006/05/20(土) 22:34:23ID:???$wday = ('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday') [$wday];
すら分からない初心者に、自分はこんなにすごいんだYOと自慢しているようにしか見えない。
0676nobodyさん
2006/05/20(土) 22:44:06ID:???0677nobodyさん
2006/05/20(土) 22:45:03ID:???0678nobodyさん
2006/05/20(土) 22:53:39ID:???相手のレヴェルも考えましょうってことサ
>>677
リアルで聞かれたら親切に教えるんで、俺もやっぱりお人好しかなw
0679nobodyさん
2006/05/20(土) 23:10:55ID:???0681nobodyさん
2006/05/21(日) 00:40:52ID:???0682nobodyさん
2006/05/21(日) 01:34:49ID:???0683nobodyさん
2006/05/21(日) 03:26:23ID:MNSamSTB現在チャットを作っているのですが
在室者・閲覧者の表示方法がわかりません
どういう感じにすれば表示できるかご教授してくださるとうれしいです
■ このスレッドは過去ログ倉庫に格納されています