Perlコーディング初心者質問スレ Part 45
■ このスレッドは過去ログ倉庫に格納されています
0001988
2005/12/08(木) 22:48:27ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0166nobodyさん
2005/12/19(月) 11:14:46ID:???0168nobodyさん
2005/12/19(月) 15:14:31ID:nE/lruN5英語のフォームページを作っています。
htmlの中で
<html lang="en">と
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
として英語用にしています。
フォーム自体はきちんと動くのですが、届いたメールのタイトル(件名)が文字化けします。
「英語ページよりお問い合せ」が「英語ペ?[ジよりお問い??ケ」になります。
英語ペ\ージよりお問い\合せとか英語\ペ\ー\ジよりお問\い\合\せなど試してみたのですが、うまくいきません。
jcode.plはcgiの中に読み込んでいますが、ページの内容が英語しかない場合は日本語を完全には使えないのでしょうか?
0169nobodyさん
2005/12/19(月) 15:20:26ID:???http://www.atmarkit.co.jp/fnetwork/rensai/netpro03/netpro01.html
ここの前編と後編読んでからもう一度来いや
0170168
2005/12/19(月) 16:02:23ID:???■日本語はテキストではない?〜テキストの送受信
を読んで、単純に
Content-Type: text/plain; charset="ISO-2022-JP"
を
Content-Type: text/plain; charset="SJIS"
に変えたらいいのかな、って思いましたがうまくいきませんでした。
http://www.atmarkit.co.jp/fnetwork/rensai/netpro04/netpro01.html
の●一般的なヘッダでの利用を読んで
subject:のところに=?ISO-2022-JP?B?と?=を入れて、
その間にタイトル(件名)として使う文章をbase64で変換した文字を入れました
ttp://phpspot.net/php/pgbase64%83G%83%93%83R%81%5B%83h%83c%81%5B%83%8B.html
は何故かうまくいかなかったので
ttp://www.vector.co.jp/soft/win95/util/se139646.html
でbase64に変換しました。
これでできました。ありがとうございました。
0171nobodyさん
2005/12/19(月) 17:13:11ID:mSKnbNI+小数点以下がどれくらい続くかは知らない
0173nobodyさん
2005/12/19(月) 19:55:13ID:???0174nobodyさん
2005/12/19(月) 20:12:41ID:???0175nobodyさん
2005/12/19(月) 22:15:36ID:M/zhZkxT頑張ればPerl/CGIで簡単な掲示板を作れるかも、という程度でしょうか。
現在、HTML::Templateを使ってコーディングしています。
テンプレートファイル内から TMPL_VAR でパラメータを渡す時、
$template->param(
'PARAM_1' => $var { 'PARAM_1' } ,
'PARAM_2' => $var { 'PARAM_2' } ,
'PARAM_3' => $var { 'PARAM_3' } ,
);
というようにやるところを、
出来るだけ動的に行いたいと思っています。
テンプレートファイル内のパラメータ PARAM_XX に対し、
ハッシュ $var { 'PARAM_1' } の値を渡せるようにしたいのですが、
どのようにコーディングすれば良いでしょうか。
自分なりに、環境変数一覧を書き出すプログラムを参考にして
foreach my $key ( keys %var ) {
$template->param ( $key => $var { $key } ) ;
}
と書いてみたのですが、値が渡された様子はありませんでした。
0176175
2005/12/19(月) 22:25:36ID:???誤:
ハッシュ $var { 'PARAM_1' } の値を渡せるようにしたいのですが、
正:
ハッシュ $var { 'PARAM_XX' } の値を渡せるようにしたいのですが、
それと、Perlのバージョンは5です。
0177nobodyさん
2005/12/19(月) 22:46:36ID:???% perl -e 'use HTML::Template; $t = HTML::Template->new(scalarref => \ "A=<TMPL_VAR NAME=A>\nB=<TMPL_VAR NAME=B>\n"); %h=(A=>"foo", B=>"bar"); foreach $k(keys %h){$t->param($k=>$h{$k});} print $t->output;'
A=foo
B=bar
(@_@)
0179nobodyさん
2005/12/19(月) 23:18:48ID:???(10分後)
変数名違ぇじゃん… orz
ご迷惑おかけしました。
俺の半日はなんだったんだ。
0180nobodyさん
2005/12/19(月) 23:30:59ID:mSKnbNI+0181nobodyさん
2005/12/20(火) 00:11:38ID:???0182nobodyさん
2005/12/21(水) 09:34:15ID:m1/a3jED0183nobodyさん
2005/12/21(水) 09:53:57ID:m1/a3jED流れとして
どっかリンク元→ a.html → b.cgi
ってかんじでaのフォームで変数をb.cgiに渡すってかんじなんだけど
b.cgiで$ENV{'HTTP_REFERER'}を使うと、a.htmlがリンク元として
表示されてしまいます。
どっかリンク元の環境変数を得るにはどうすればいいですか?
0184nobodyさん
2005/12/21(水) 10:25:10ID:???a.htmlをa.cgiにしてそこで取得する
どっかリンク元→ a.cgi → b.cgi
またはa.htmlでJavascript使って渡す
0185nobodyさん
2005/12/21(水) 12:44:51ID:m1/a3jEDjavascriptでも出来るんですか!?
0186nobodyさん
2005/12/21(水) 14:50:11ID:kTJQiyq+opendir DIR, "hogehoge" || die "cannot open";
@entry = readdir DIR;
foreach(@entry){
opendir DIR, "$_";
@entry = readdir DIR;
if($_ =~ /.txt\z/){
$changemode = chmod 0664, "$_";
}
}
と書いたのですが、
hogehogeの中にディレクトリがあった場合は。そのディレクトリの配下にあるディレクトリやファイルを更新しません。
hogehoge配下にあるディレクトリやファイル全てを読み込むようなプログラムを作るのにはどのようにしたらよいでしょうか?
0190nobodyさん
2005/12/21(水) 18:47:58ID:???語尾が.htmlで終わるものを「処理」を行っているのですが、
.htmlだけでなく、.htm .jpg .gif も「処理」対象にしたい場合は
どのような正規表現を使ったらよいですか?
if($file =~ /.html\z/){
処理
}
0191nobodyさん
2005/12/21(水) 18:58:47ID:???foo();
}
0192nobodyさん
2005/12/21(水) 19:31:01ID:HAcTfIEX書いてるので、プログラムに
if($abc=~/\p{Han}/){
を記述しているのですが漢字に一致しません。
$abcには漢字が含まれているのですが・・・
一致させるには、ほかに記述すべきことがあるんでしょうか?
0194nobodyさん
2005/12/21(水) 20:59:20ID:???つ/
0196nobodyさん
2005/12/21(水) 21:37:38ID:ib12VQrv0198192
2005/12/21(水) 21:45:01ID:HAcTfIEX何もしてないのでeucそのまんまです。
「use encoding 'euc-jp';のように、
スクリプトに使っている文字コードを指定することで
\p{Han}+でEUCに正しく一致する」とだけ本には書いてあるので、
プログラムにuse encoding 'euc-jp'の一行を加えましたが、
一致しませんでした。
多分ものすごく基本的なことが理解できてないのだと思います。
もしかしてeucをUnicodeに変換しないとダメということなんでしょうか?
もしそうならその仕方を教えてもらえないでしょうか?
0199nobodyさん
2005/12/21(水) 22:37:39ID:???初めて知った機能だよ。
use encoding qw(euc-jp);
my $str = "漢字";
$str =~ /\p{Han}/ and print "true";
一応こんなでも通るけど。
0201192
2005/12/22(木) 00:17:58ID:l+S0SPkvuse encoding 'euc-jp'のところでエラーが発生してます
error.log見てわかりました。
Wide character in print at ....ってなってるんですが・・・・
なんでなんかな。perlは5.87なのにapche2.0やIE6では駄目とか?
0203nobodyさん
2005/12/22(木) 07:24:22ID:???ttp://www.pure.ne.jp/~learner/program/Perl_unicode.html
0204nobodyさん
2005/12/22(木) 10:49:59ID:iSEjIkIt例えば
start.exe
readme.txt
stop.exe
index.html
と並んでいたら、
.exe
.txt
.exe
.html
のように抜き出したいのですが
0205nobodyさん
2005/12/22(木) 11:41:44ID:???foreach $filename (@filenames) {
push @extensions, (split(/\./, $filename))[-1];
}
foreach $extension (@extensions) {
print $extension, "\n";
}
0206nobodyさん
2005/12/22(木) 12:12:50ID:???print join "\n", map /(\.[^.]+)\z/, qw(start.exe readme.txt stop.exe index.html);
0208204
2005/12/22(木) 13:05:37ID:iSEjIkIt拡張子が重複する(フォルダは無視)場合は表示しないようにするプログラムを作ってたんだけど、
うまくいきません
例えば
start.exe
hogehoge/
readme.txt
stop.exe
index.html
readme.html
と並んでいたら、
.exe
.txt
.html
のように抜き出したいのですけど、、
センスないのかなorz・・・
0209nobodyさん
2005/12/22(木) 13:11:55ID:???日記はチラシの裏にでも書いてろ
0210nobodyさん
2005/12/22(木) 13:15:55ID:???0211nobodyさん
2005/12/22(木) 13:16:55ID:???0213204
2005/12/22(木) 14:43:03ID:iSEjIkItif(-f $file){
push @extensions, (split(/\./, $file))[-1];
$fext = (split(/\./, $file))[-1];
}
foreach $extension (@extensions) {
$ext{$extension} = $ext{$extension} +1;
}
($key,$value) = each %ext;
while(($key,$value) = each(%ext)){
print $key, " - ", $value, "\n";
}
>>212のアドバイスがききました
ありがとうございました
0214nobodyさん
2005/12/22(木) 16:51:29ID:9N6o95FW出力を CGI::Carp qw(fatalsToBrowser) のようにするには
どうすればよいんでせう?
0215nobodyさん
2005/12/22(木) 16:57:57ID:???0216214
2005/12/22(木) 17:14:18ID:???早速ありがとう!
dependecies にひっかかってなかなかインストールできなかったけど
無理やり動かせた。
開発効率かなりあがりそうだ。
でも、この画面ユーザには見せたくないね。
やっぱエラー処理はちゃんと書かないとダメそうだ。
0218nobodyさん
2005/12/23(金) 16:23:03ID:???0219nobodyさん
2005/12/23(金) 17:31:00ID:???0220nobodyさん
2005/12/24(土) 19:39:16ID:???0221nobodyさん
2005/12/24(土) 23:29:23ID:???use encodings "cp932";
を指定しているとき、 URLエンコードされたものが、正常にデコード
できません。
#!/usr/bin/perl
use strict;
use encoding "cp932"; #ここをコメントすれば上手くいく
binmode STDERR, ":encoding(cp932)";
print "Content-Type: text/html; charset=Shift_JIS\r\n\r\n";
my $value;
$value = '%95%5C%8E%A6'; #表示
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
print "しふとじす\n";
print $value;
肝心の$valueが、ちゃんと"表示"に戻りません。
use encodingsの指定をやめると正常に動きます。
原因は何となくわかる (内部はutf-8で処理しているから?)
のですが、対処方法がわかりません。
ここ嫁 でも結構ですので、教えていただけませんか?
0223221
2005/12/24(土) 23:34:41ID:???やりたいことは、ソースコードをShift_Jis(cp932)で統一したいのと、
実際に、CGI.pmを使った場合でも、GET、POSTされた Shift_Jisのデータ、
正確には、URLエンコードされたもの、が正常に取得できないので、
これをどうにかしたい、ということです。
0225nobodyさん
2005/12/25(日) 10:06:00ID:MhkrUB/B0226nobodyさん
2005/12/25(日) 10:50:26ID:sTNGkhi50227221
2005/12/25(日) 12:10:36ID:???ありがとうございます。podの方はまだ少ししか読んでませんが、
>>8 の方は読んでみました。
というか、以前から読んでいましたが、理解できていなかった...
#!/usr/bin/perl
use strict;
use Encode;
use encoding "cp932";
binmode STDERR, ":encoding(cp932)";
my $wc = '%95%5C%8E%A6'; #表示
#ただのアスキーコードだけど、utf8フラグがたつ
my $nwc = Encode::encode('cp932',$wc);
#1Byte単位でpackするために、utf8フラグを落とす
$nwc =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
#utf8フラグの立っていない$nwcに対してpackする。1Byte単位で扱える
#$nwcには、cp932の生バイナリが入る
$wc = Encode::decode('cp932', $nwc);
#$nwcのままでは表示できないので、再びutf8フラグを付ける。
print $wc;
#$wcはutf8フラグが立っているので、STDOUT出力時に
#Encode::encode('cp932',$wc)が内部的には動いている
こんな理解で大体OKでしょうか?
だけど、ずいぶんと回りくどいことしていると思います。
0228nobodyさん
2005/12/25(日) 17:27:10ID:???よく分かってるじゃないか。
encoding は一見お手軽に見えるけど、使い勝手悪いよ。
日本語は全て外部ファイルに追い出すのが遥かに楽。
0229221
2005/12/25(日) 18:24:14ID:???実はencodingをはじめて知ったとき、『これは使える』と思ったのですが、
URLデコードのところで躓いて、導入をあきらめていました。
そのときは、ソースに日本語べた書きでしたが、やっぱり外部ファイルに分離
するのがいいですね。
encodingを使えば、=~(マッチ演算)などで、半角カナなど(何も考えず)上手く処理できる?
print "本能"; などが文法エラーにならないなど、メリットはありますが...
逆に使えなくなるモジュール等を考えると、デメリット(副作用)の方が多いような。
あと、何かとデバックのために Data::Dumperを使って表示するのですが、
Dumperを使って日本語(の入った変数)を表示した場合、Perl内部コードがそのまま
表示されるので、不便といえば不便ですな。
0230nobodyさん
2005/12/25(日) 18:25:21ID:???てすとhttp://hoge.hoge/index.htmlてすと
が入っていたとします。
そこで$resultに上記のURLを変換(置換)して
てすと<A HREF="http://hoge.hoge/index.html" TARGET="_blank">http://hoge.hoge/index.html</A>てすと
としたいのですがどうしたらよいのでしょうか?
ググったら正規表現とか出てきたのですが、良く分かりませんでした。
自分でやってみたこと
$result = $comment =~ s/(http:\/\/[^ \"\r\n\<]+)/\<a href=\"$1\" target=\_blank\>$1\<\/a\>/g;
print <<END;
$result
END
これをやったら$resultには何も入りませんでした・・・。
0231nobodyさん
2005/12/25(日) 19:29:51ID:???必要な所にno encoding入れれば、それほど面倒でもなくなるよ。
それも結構、落とし穴があったりするけど。
>>230
(my $result = $comment) =~ s/ (以下略
それと正規表現も修正。
0233230
2005/12/26(月) 00:25:11ID:???(my $result = $comment)
にしたら無事できました。
あとは正規表現を修正しようかと思って
ttp://www.din.or.jp/%7Eohzaki/perl.htm#httpURL
こちらを参考に
s?https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$,%#]+
この正規表現を使わせて頂いたのですが
今度はURLのみ表示されません・・・。
どうしたらよいでしょうか?
0234nobodyさん
2005/12/26(月) 01:03:13ID:???TMPL_VAR で、改行コードを含んだ文字列を置換するとき
改行コードを<br>や<br/>に変換する便利な方法は無いのでしょうか。
要求される仕様上、<pre>やスタイルシートなど、<br>以外で改行させる方法は不可とします。
現状:
改行コードが自動的に置換されないので、ブラウザ上では改行されて見えない
やってみた方法:
(1) 自前で改行コードを<br>に変換、HTML::Templateのサニタイジング機能を使う
→ <br>というタグが見えてしまう
(2) 自前で改行コードを<br>に変換、HTML::Templateのサニタイジング機能を使わない
→ 正常に改行されるが、セキュリティ上かなりやばい
(3) 自前でサニタイジング、HTML::Templateのサニタイジング機能を使わない
→ とりあえず問題なく動くが面倒&重い。他の方法はないものか?
Perlのバージョンは5。
HTML::Templateのバージョンは不明。(申し訳ない、比較的新しいとは聞いた
0235230
2005/12/26(月) 01:19:00ID:???(s?https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$%#]+)
にしたら上手くいきました。
変更点は
(1) ()で挟んだ
(2) 後ろの方の$と%の間の,を無くした
です。
何でこうなるのかまだ理解してないので自信ないのですが
これであってますよね?
0236nobodyさん
2005/12/26(月) 02:03:15ID:???出力する文字列を配列にしてTMPL_LOOPで回すのは無し?
サニタイズぐらい自分でやれよって気はする。
>>235
括弧で挟むのは、置換するところで$1として使ってるから。
カンマは有っても動きそうだけど。
0237234
2005/12/26(月) 02:10:56ID:???まあ、サニタイジングくらい自分でやるですよ。
これくらいHTML::Templateの機能にあっても良さそうなもんなんですけどね。
0238230
2005/12/26(月) 02:18:17ID:???できなかったのは他に原因があったのかな・・・。
何はともあれありがとうございました。
0239nobodyさん
2005/12/26(月) 10:03:49ID:???Template Toolkitならhtml_line_breakというフィルタがあるので
[% foo | html | html_line_break %]
てな感じでいけるんだけどね。
use strict;
use Template;
my $t = Template->new();
my $input = <<INPUT;
[% foo | html | html_line_break %]
INPUT
my %vars = (
foo => "foo<>\nbar\n&hoge\n",
);
$t->process(\$input, \%vars);
0240nobodyさん
2005/12/26(月) 19:53:21ID:w9go55d/俺は、VC++で自分でつくったやつ使ってるよ。
上半分はエディタで、「実行」をおすと、下半分のブラウザに実行結果がでてくれるんだよ。
だれか、ほしいやついる?いるなら、Vectorにでもうpするけど。
0241nobodyさん
2005/12/26(月) 19:59:15ID:???0242nobodyさん
2005/12/26(月) 20:09:20ID:???0243nobodyさん
2005/12/26(月) 20:15:02ID:???0244nobodyさん
2005/12/26(月) 20:20:26ID:???0245nobodyさん
2005/12/26(月) 20:21:04ID:???0246nobodyさん
2005/12/26(月) 20:42:19ID:???nameの部分は変わることがないので、これを test.cgi?XXX とゆふうに使えるようにしたいんですが
どうすればいいでしょうか?
0247nobodyさん
2005/12/26(月) 21:01:43ID:???0248nobodyさん
2005/12/26(月) 21:09:20ID:???できました!ありがとうございました!!
0249nobodyさん
2005/12/27(火) 14:36:05ID:???my $so='ソ\';
if(/\Qソ\E/){
print "含まれています。";
}
これを実行してもソがひっかかりません。
どうしてですか?
0250249
2005/12/27(火) 14:36:55ID:???○表示させたいんですが
すいません。ミスりました。
0251nobodyさん
2005/12/27(火) 15:07:40ID:???if (/\Qソ\E/) { は if ($so =~ /\Qソ\E/) { の間違いとして、
'ソ\' は "\x83\x5C" 、
qr/\Qソ\E/ は \Q\x83\\E → \x83\x5C\x5C\x45 。
よってマッチしない。
参考: http://homepage1.nifty.com/nomenclator/perl/shiftjis.htm
0252249
2005/12/27(火) 15:10:51ID:???\x83\x5cだよな。
0253nobodyさん
2005/12/27(火) 15:48:24ID:???0254nobodyさん
2005/12/27(火) 18:30:24ID:???0255nobodyさん
2005/12/27(火) 23:40:00ID:???0256nobodyさん
2005/12/28(水) 00:47:06ID:???0257nobodyさん
2005/12/28(水) 01:30:43ID:rgfSZuvi0259nobodyさん
2005/12/28(水) 02:01:04ID:???0260nobodyさん
2005/12/28(水) 09:22:40ID:???0262nobodyさん
2005/12/28(水) 09:55:45ID:???0263nobodyさん
2005/12/28(水) 10:10:27ID:???use Benchmark;
$buf = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
timethese(10000000, {
1 => sub { if($buf =~ /JKL/){} },
2 => sub { if(index($buf, 'JKL')){} },
});
----------------------------------------------------------------------
Benchmark: timing 10000000 iterations of 1, 2...
1: 5 wallclock secs ( 4.53 usr + 0.01 sys = 4.55 CPU) @ 2199736.03/s
(n=10000000)
2: 3 wallclock secs ( 1.97 usr + 0.03 sys = 2.00 CPU) @ 4997501.25/s
(n=10000000)
0265nobodyさん
2005/12/28(水) 10:34:57ID:???>>254 や >>261 は同じ人ですか?
あまり関係無いですが、if(index($buf, 'JKL')){} なんて書くのはバグの元ですよ
■ このスレッドは過去ログ倉庫に格納されています