Perlコーディング初心者質問スレ Part 57
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2008/02/25(月) 19:25:51ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
お勧めサイトは >2 以降
前スレ http://pc11.2ch.net/test/read.cgi/php/1189939783/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0345nobodyさん
2008/04/17(木) 04:13:49ID:CjUpsUhEAll UTF-8 でやってます。
さらに USE CGI しないURLデコードをやってみたところ、マルチバイト文字が文字化けするようになりました。
全部□になります。
?#!c:/user/local/bin/perl510/bin/perl.exe
use utf8;
use encoding "utf8";
# ↓UTF8でPOSTされた情報を想定
my $str = '%E8%8C%B6%E6%B1%B2%E5%85%BC%E9%9B%91%E7%94%A8%E4%BF%82';
# ↓URLデコード(今回$strに+はないのでそのへんは省略)
$str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("H2", $1)/eg;
# ↓出力
print "Content-type: text/html; charset=UTF-8\n\n";
print "テスト // START // $str<br>\n";
これでHTML全体としては正しく表示されているんですが、$str部分のみが文字化けします。
ウェブで原因を調べること丸1日、これについてどこにも情報がありませんでした……
0346nobodyさん
2008/04/17(木) 07:21:16ID:???use encoding "utf8";
# ↓UTF8でPOSTされた情報を想定(内部ではワイドキャラクタとして格納されてます)
my $str = '%E8%8C%B6%E6%B1%B2%E5%85%BC%E9%9B%91%E7%94%A8%E4%BF%82';
utf8::encode($str); # 一旦UTF-8フラグを落として
# ↓URLデコード(今回$strに+はないのでそのへんは省略)
$str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("H2", $1)/eg;
utf8::decode($str); # UTF-8フラグを付け直す
0347nobodyさん
2008/04/17(木) 09:58:36ID:???> # ↓UTF8でPOSTされた情報を想定(内部ではワイドキャラクタとして格納されてます)
> my $str = '%E8%8C%B6%E6%B1%B2%E5%85%BC%E9%9B%91%E7%94%A8%E4%BF%82';
それデコードしたら、バイナリ(utf8フラグoff)のUTF-8文字列。
とりあえず、use utf8;とuse encoding "utf8"を外して、そのままprintしてみ。
ちゅうか、use utf8 とuse encoding "utf8"両方してる意味がわからん。
0348nobodyさん
2008/04/17(木) 14:34:42ID:FD3bsXbG解決しました。情報に感謝します。
>>346の内容を、Encode::〜でやりました。
こういうのって結構な落とし穴ですね。フラグのことはわかっているつもりでしたが……
0349nobodyさん
2008/04/17(木) 20:17:29ID:2zzFnXWLCGI::Applicationパッケージを使っているんだけど、
param() 関数で、数字だけの長い「文字列」を受け取ると
数値リテラルとして、しかも丸められた値が返されちゃうんだけど、
文字リテラルとしてそのまま受け取れるよい方法ないかな?
0350349
2008/04/17(木) 22:21:21ID:???CGI.pmにまでさかのぼって調べた結果、
query()->param()は文字リテラルで返してました。
自分が書いた、表示する際の処理のバグでした。orz
0351nobodyさん
2008/04/18(金) 00:03:02ID:qXgVgrBZ自分で作ったhash refの配列がデリファレンスできません。
$array[0]->{key}
$array[0]{key}
${$array[0]}->{key}
とか書いてみましたが様々なエラーが出ました。どう書いたらいいですか?
0352nobodyさん
2008/04/18(金) 00:07:12ID:???ソートをしようと思い、下記のように書いたらhash refを配列扱いするなと言われます。
my @sorted = sort {$array[$b]->{score} <=> $array[$a]->{score}} @array;
よろしくお願いします。
0353nobodyさん
2008/04/18(金) 00:20:08ID:???my @sorted = sort {$b->{score} <=> $a->{score}} @array;
0354nobodyさん
2008/04/18(金) 10:01:49ID:???0355nobodyさん
2008/04/18(金) 18:42:42ID:J/rLxrZJこれだけでも教えてくれると助かります…。
1.#INF の意味はなんですか?インフィニティ?
検索しても#は検索対象にならないらしく、
*.INFの設定ファイルや関係無いものが出て来るばかりで…。
0356nobodyさん
2008/04/18(金) 19:06:45ID:???0357nobodyさん
2008/04/19(土) 09:40:11ID:???それかインフォーラム
もしくはインフェルノ
0358nobodyさん
2008/04/19(土) 12:48:02ID:n4AN2xdTRNAというアンテナソフトを使っています。
すでに動作してるのですが、summary部分のhtmlタグを除去したいと思います。
http://www-kasm.nii.ac.jp/~i2k/tmp/rna/rss/recent_entry.html
のようにRSSを取得してくるCGIなのですが、
summary部分にhtmlタグが残ってしまいます。
ATOMやRSS2.0などでしょうか、
Yahoo!やexcite等RSSにhtmlタグが入ってるサイトを巡回すると
htmlタグが入ってしまいます。
template/recent_template には
<div class="summary">
<$RNAItemDescription$>
</div>
となっており、そのあたりを作ってると思われる
lib/RNA/AntennaTree.pmの1029行目、
my $encoded_descript = encode($item->{channel}->{description});
の後に
my $encoded_descript =~ s/<.*?>//g;
を追加してみたところ、サマリー部分がなくなってしまいました。
開発がストップしてるCGIなので、なんとか改造して使い続けたいと思っています。
どうかご教示願います。
0359nobodyさん
2008/04/20(日) 00:00:52ID:???>>355
備長炭 自殺方法 でぐぐれ。それでダメなら二項分布 オーバーフローとか。
0360nobodyさん
2008/04/20(日) 01:46:25ID:???現物ソース確認したわけじゃないけど
ttp://naoya.dyndns.org/~naoya/mt/archives/000611.html
の下の方にある remove_html を試してみたらどうかな。
0361nobodyさん
2008/04/20(日) 02:10:18ID:???そのモジュールについては詳しくはわからないけど、もともとのソースをいぢるんじゃなくて、
それが吐き出したものを、自前で書き換えればいいんじゃね?
0362nobodyさん
2008/04/20(日) 02:30:50ID:???> my $encoded_descript = encode($item->{channel}->{description});
> の後に
> my $encoded_descript =~ s/<.*?>//g;
> を追加
って書いてるんだから
my $str = "<strong>大切な</strong>文書";
my $str =~ s/(.)/$1/g; # 行頭の何かが余計
print length($str);
こういうことじゃないの。
0363nobodyさん
2008/04/20(日) 16:44:58ID:???$text =<<EOL;
name = $h->{'name'}
mail = $h->{'mail'}
EOL
とやっても変数が展開されません。
仕方ないのでハッシュにデリファンスしてますが、
方法があったら教えてください。
0364nobodyさん
2008/04/20(日) 17:36:03ID:???0365nobodyさん
2008/04/20(日) 20:52:48ID:tHisgd6UOUTをカウントするためなんすけど、アンカーから自前のCGIページを通過させてリンク先を表示させるにはどうすればいいですか?
0366nobodyさん
2008/04/21(月) 00:00:18ID:???0367nobodyさん
2008/04/21(月) 18:56:21ID:???my $h = {name=>'john', mail=>'[email protected]'};
my $text =<<EOL;
name = $h->{'name'}
mail = $h->{'mail'}
EOL
print $text;
こんな感じ。
0368358
2008/04/23(水) 09:11:49ID:???ありがとうございます。
remove_html、使いたいのですが使い方がわかりません...
# http://naoya.dyndns.org/~naoya/mt/archives/000611.html
sub remove_html {
my ($str) = @_;
my $ret;
if (defined $str) {
my $p = HTML::TokeParser->new( \$str ) or die "$!";
do {
my $plain = $p->get_text;
$ret .= $plain;
} while (my $token = $p->get_tag);
}
$ret;
}
を lib/RNA/AntennaTree.pm の最下部に追記して、
my $encoded_descript = encode($item->{channel}->{description});
の後に見よう見まねで
my $encodec_descript = &remove_html();
としてみましたが変わらずでした。
0369nobodyさん
2008/04/23(水) 12:47:07ID:???どこで手に入れる事ができるでしょうか?
0371↑
2008/04/23(水) 13:08:34ID:???0372nobodyさん
2008/04/24(木) 18:43:40ID:???という文字列から
ABCとDEFを削除してXXXのみを表示させたい場合はどうすればよいのでしょうか?
$moji = ABCXXXDEF;
$ans = $moji からABCとDEFを削除;
print "$ansです\n"
という具合でいいんでしょうか?
このABCとDEFを消す処理の部分がわかりません。
0373nobodyさん
2008/04/24(木) 18:47:46ID:???print $moji;
0376nobodyさん
2008/04/26(土) 13:15:07ID:flUVuiqJ区切りが/であったり\であったりとまちまちです。
perlはLinux上で動いているので、デフォルトでは、/で区切られている場合しか、ファイル名を取り出せません。
\で区切られている場合でも、取り出せるようにするにはどのようにしたらよいのでしょうか?
fileparse_set_fstypeでMSWin32を指定してしまうと今度は、Unixからアクセスしてきた場合にうまくいきません。
0377nobodyさん
2008/04/26(土) 13:19:19ID:???こんなもん中学生でも分かるぞカス死ね
0378nobodyさん
2008/04/26(土) 16:13:45ID:flUVuiqJ0380nobodyさん
2008/04/26(土) 17:01:10ID:???Perlが動いているサーバーのOSが関係する。
そして、basenameは動いているOSによって区切りを/か\か自動的に
判断してくれるので便利に使える。
サーバーがWindowsでもLinuxでもbasenameは正しく動いてファイル名を取り出せる。
取り出せない場合は、何か別の原因。
0381nobodyさん
2008/04/26(土) 19:45:43ID:???0382nobodyさん
2008/04/26(土) 21:48:20ID:vQRq4Omz時間と日数おしえてもらえませんか?時間とか1日何時間くらいしてます?
0383nobodyさん
2008/04/26(土) 22:09:54ID:???0385nobodyさん
2008/04/26(土) 22:49:57ID:???皆さんは「週何日、1日当たり何時間」なんていう時間割みたいな方式で
取り組んできたわけじゃないので、そういうのはよくわかんないのです。
そりゃ、そんな方式で堅苦しく取り組んできた人もいるかもしれないけど。
あなたが今までにちんちんを何ストロークしてきたかが不明なのと似てます。
0386nobodyさん
2008/04/27(日) 00:52:54ID:G3KB/HmGスラッシュをURLエンコードさせたくないのですが、可能でしょうか?どなたか助けてください・・
p://example.net/dir/index.cgi?name=<em>hoge</em>
このように、どうしてもタグが含まれてしまうURLなので困ってます。
見るからに初心者ですが、どうかよろしくお願いします。
0388386
2008/04/27(日) 02:55:07ID:G3KB/HmGそうですか・・
諦めて他に方法がないか試行錯誤してみます
ありがとうございました。
0390nobodyさん
2008/04/27(日) 23:35:33ID:???コード書いて1週間かかった気がする
そんな自分は C (すっかり書けないけど、ポインタで躓くまでは書いてた)、VB (アプリをいくつか作ってた) の経験ありです。
0391nobodyさん
2008/04/27(日) 23:39:03ID:???Webアプリ(cgi)は時間がかかると思う。
0392nobodyさん
2008/04/27(日) 23:44:48ID:???0393nobodyさん
2008/04/30(水) 17:01:56ID:9OxUbc+M0394nobodyさん
2008/04/30(水) 17:13:24ID:???rand(51)
0 〜 51 未満を生成 (未満は 51 を含まないので 50 以下の数字が現れる)
+100
下限値である 100 を加えてやる
以上
0395nobodyさん
2008/04/30(水) 17:14:49ID:???0396nobodyさん
2008/04/30(水) 17:19:40ID:???0398nobodyさん
2008/04/30(水) 18:11:00ID:???質問者の質問が悪いところまでフォローして手取り足取りするのが役目?
0399>>393
2008/04/30(水) 18:26:54ID:9OxUbc+M確かに>>398さんの言うとおりです。わざわざフォローして下さった親切なお二方に感謝します。
0400nobodyさん
2008/04/30(水) 18:38:47ID:???どうも下記例のforeachのループの中で、さらにwhileのループを
回せないのですが、たぶん簡単な理由だとは思うのですが、
お助け下さい。
他にもこのようなforeachのループの中で、foreachのループも回せないと
思います。
foreach $number(@number){
while (<F2>) {
print "$number\n";
if (/$number/)
{
print "マッチしました\n";
print F3;
}
}
}
0403nobodyさん
2008/04/30(水) 19:48:00ID:???0404nobodyさん
2008/04/30(水) 20:17:59ID:GavbPT5W2周目はファイルを読み込むループが発生しません
解決法は2つ
・While の直前でファイルを開くようにする
・While の直前で seek を使ってファイル位置を先頭に戻す
です。
負荷は後者の方が幾分か軽いです
0405nobodyさん
2008/04/30(水) 20:28:06ID:???場合によってはこれもありかなと思った。無駄にメモリ食うけど。
0406nobodyさん
2008/04/30(水) 20:47:41ID:???0407400
2008/04/30(水) 23:43:57ID:???1回目のforeachが終わったときに<F2>が空になる ってマジですか。
例のループにseekを追加して、動くようにしていただけませんか?
お願いします。
0409nobodyさん
2008/05/01(木) 12:48:54ID:???open(F2, "hoge.txt");
while (<F2>) {
foreach $number(@number){
〜
}
}
close(F2);
0410nobodyさん
2008/05/01(木) 13:18:21ID:???自分でやれ。
できないなら金払って業者つかえ。
代行するところじゃなく、自分で作るためのヒントを与えるところだ。
ここまでヒントがそろったらあとは調べながらできる。
0411nobodyさん
2008/05/01(木) 13:51:56ID:???ちゃんと意味がわかってから略すように汁
0412400
2008/05/01(木) 23:38:01ID:???>410 GW中くらい、自宅警備を止めてみたら?
>411 省略ハァ? 汁?
0413409,411
2008/05/01(木) 23:46:36ID:???0414nobodyさん
2008/05/02(金) 00:07:00ID:???ワロタ
0415nobodyさん
2008/05/02(金) 05:46:04ID:???「ものを学ぶ姿勢」ってやつを身に着けないと成長できないよね
0416nobodyさん
2008/05/02(金) 08:12:32ID:???これ10代だったら笑って流せるけど、20代以上で本気で言ってたら深刻ww
0417nobodyさん
2008/05/02(金) 10:22:44ID:???0418nobodyさん
2008/05/02(金) 10:32:20ID:???あと、これはおそらくは宿題だなw
0419nobodyさん
2008/05/02(金) 11:18:57ID:???とっくに質問者は消えてることに気づけよ禿げ
0422nobodyさん
2008/05/02(金) 13:12:28ID:???0423nobodyさん
2008/05/02(金) 13:34:20ID:???医者いったほうがええんちゃうかw
リアルでアレかw
0424nobodyさん
2008/05/02(金) 13:43:58ID:???0425nobodyさん
2008/05/02(金) 14:15:25ID:???0426nobodyさん
2008/05/02(金) 14:47:41ID:???0427nobodyさん
2008/05/02(金) 15:08:52ID:???0428nobodyさん
2008/05/02(金) 18:44:35ID:???0429nobodyさん
2008/05/02(金) 23:07:56ID:???思い込み激しいとか言われへん?
回りに迷惑かけても気づかないタイプだな
回答もしないのに罵倒するのはお前だけやろ
頭変すぎてわからんかw
0432nobodyさん
2008/05/02(金) 23:59:11ID:???0433nobodyさん
2008/05/03(土) 02:50:47ID:???0434nobodyさん
2008/05/03(土) 03:07:39ID:???0435nobodyさん
2008/05/03(土) 10:04:09ID:???0436nobodyさん
2008/05/03(土) 18:44:15ID:???0437nobodyさん
2008/05/03(土) 19:02:10ID:???0438フー子
2008/05/04(日) 19:36:48ID:798fbSDd何のためにあるの?どうやって使うの?
君かわいいね。
・・・ぶつ森のスレかとオモタorz...
ttp://search.cpan.org/~mrjc/cvswebedit-v2.0b1/cvs-web/lib/CGI/Base.pm
ttp://search.cpan.org/~mrjc/cvswebedit-v2.0b1/cvs-web/lib/CGI/Request.pm
を眺めてみればよろしいかと。
例文を眺めればだいたい何がしたいのかが見えてくるかと。
英文は無理に読まなくてもよろしいかと。
0441nobodyさん
2008/05/04(日) 20:22:15ID:???0442nobodyさん
2008/05/05(月) 14:08:42ID:GD7pTJpy以下のように記述すると、管理人である自分には登録メールが送られますが、
管理人以外に、書き込みした人にも登録確認メールが送られるようにしたいんです。
#Sendmailによる送信処理
if (open(MAIL,"| $sendmail -t")){
print MAIL "X-Mailer:legend2\n";
print MAIL "To: $administrator\n";
print MAIL "Errors-To: $administrator\n";
print MAIL "From: $administrator\n";
print MAIL "Subject: $subject\n";
print MAIL "MIME-Version: 1.0\n";
print MAIL "Content-type: text/plain; charset=ISO-2022-JP\n";
print MAIL "Content-Transfer-Encoding: 7bit\n";
print MAIL "$mail_comment\n";
print MAIL "\n";
close(MAIL);
}
}
以下のどれかを使うのでしょうか?
print SENDMAIL "From: $sender <$from>\n";
print SENDMAIL "To: $to\n";
print SENDMAIL "Cc: $cc\n";
print SENDMAIL "Bcc: $bcc\n";
どうすれば良いか御教授下さい。宜しくお願いします。
0443nobodyさん
2008/05/05(月) 14:20:17ID:???# CGIは板違いだが、この処理自体はCGIと関係がないので。
if文のブロックを、Toヘッダだけ「書き込みした人」のアドレスにしてもう一度処理するか、
Toを「書き込みした人」のアドレス、CcまたはBccを「管理人」のアドレスにするか。
Errors-Toヘッダはobsoluteだった気がします。
envelopeアドレスを指定するべし。sendmailに-fオプションに続けてアドレスを指定する。
ttp://sonic64.com/2004-11-07.html
0444nobodyさん
2008/05/05(月) 16:36:56ID:???書かれた古文書を元にCGI作るな。めーわくだ。
0445nobodyさん
2008/05/05(月) 18:19:44ID:???例文または参考 URL ぐらい提示すればいいじゃない
■ このスレッドは過去ログ倉庫に格納されています