Perlコーディング初心者質問スレ Part 40
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001nobodyさん
05/01/27 18:08:42ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0896nobodyさん
05/03/05 18:58:05ID:???仕事で作る奴はちょろちょろ変更あるのでテンプレートで分けるように
なった。しょうもない文章の修正とかでいちいち本体いじるのうっとう
しいと思ってたのでなかなかよろしい。
で、慣れるとプログラムがすっきりするので、個人で作るような
のもテンプレ使ってたりします。
テンプレライブラリは重いといえば重いんだけど、1ページの表示が
遅いってほどじゃないので、気にすることないと思う。
0897nobodyさん
05/03/05 19:06:00ID:???メチャクチャなので使う気になれないんだよな。
きちんと変換表が統一される夢のような時代は絶対来ないけど
たぶんそのうちunicodeの変換表の有力な奴相互に判定/変換する
ようなライブラリができるだろうからそれ待ち(笑)
0898nobodyさん
05/03/05 19:27:37ID:???そもそも文字コードなんて商売上の理由なんだろうから歩みよりはないだろうし。
俺はこれからもSJIS使っていくぞ。
0899nobodyさん
05/03/05 19:29:22ID:???俺の場合だと hash や array にぶちこんで渡すので変数が乱立するってことは無い
DBI の fetchrow_hashref で取ってきた hash をそのまま Template に渡してはいおしまい、みたいな感じで
お蔭でプログラムの見通しが断然良くなった
正直 Template 使わない CGI はもう書きたくない
普通は重いんだろうとは思うが、俺んとこは mod_perl 環境なので、
パース済 Template のキャッシュも効いて、全然重さを感じない
0900nobodyさん
05/03/05 20:03:51ID:???0901nobodyさん
05/03/05 20:55:09ID:???例えば、ある顧客のデータと、管理者のデータを一度に表示したい時、
{
client_name => 'hoge', client_address => 'foo',
admin_name => 'hage', admin_address => 'bar',
}
とかで渡してやらんとだめだ。
{
client => { name=> 'hoge', address='foo' },
admin => { name => 'hage', address='foo' },
}
とかじゃだめってことね。
この点Template-Toolkitは偉すぎる。
0902nobodyさん
05/03/06 09:56:09ID:???ちょっとでもスクリプト軽くしたい一心から、
HTML::Templateは問題外と思っている。
HTML::Templateを、数万回/day呼ぶとやっぱ重いかな?
0904nobodyさん
05/03/06 13:35:38ID:???0905895
05/03/06 13:41:02ID:???私的にはhashやarrayの中に入れることも乱立だと思ってます。
プログラムの見通しは現状でずいぶんいいんですよね。
開始100行部分辺りがプログラムの流れで細かい処理はルーチンを下のほうに作って
あって、そいつらはグローバルをいじることはできなくしてあるし。
間違っても全体の流れてきな処理と個々の処理を同列視しないように作ってます。
こういうやり方にしてから拡張もいくらでもできるようになったし。
でも皆さんなかなか評判がいいようなのでちょっと遊びスクリプトを作る時には
使ってみようかな。ありがとうございました。
0906nobodyさん
05/03/06 14:50:24ID:???すごく同意 なので私は
$ref->{aaa}->{bbb}を$hash{'aaa-bbb'}に変換する関数を作って使ってます。
$change->{form_data} = \%form_data;
とかが出来るようになって幸せ
0908nobodyさん
05/03/06 16:13:12ID:???ただの構造化で満足している人がTemplateを使えるとは思いませんが。
そもそもビューを切り離すことにメリットを感じない程度の小規模スクリプトしか
書いてないんでしょうから。
0909nobodyさん
05/03/06 16:18:15ID:???まあ使ってみて目覚めるということもあるから、生温かく見守ってあげようや
漏れも頭ではMVCとか知ってたけど、実際にモノを作ってみるまで恩恵がわからんかった
0910nobodyさん
05/03/06 17:13:17ID:???まあこのスレのレベルではしょうがないか。
0911nobodyさん
05/03/06 17:48:51ID:???Templateを単純なコード埋め込み可能テキストくらいにしか使えてないんだろうな。
かわいそうに。
0912nobodyさん
05/03/07 02:01:45ID:???Templateは置くだけじゃ使えないよね?
しかたなくHTML::Template派。
0913nobodyさん
05/03/07 02:03:59ID:dh8KtD970914nobodyさん
05/03/07 02:12:46ID:???syntax onを忘れずに
0917nobodyさん
05/03/07 04:10:46ID:???確かにSTDINの内容を渡しちゃうのはキモいけど
my $cgi = new CGI();
my $template = HTML::Template->new(scalarref => \$html, associate => $cgi);
とかよく使われてる手法じゃない?
0919nobodyさん
05/03/07 08:07:45ID:???$template->param(%form_data);
としてクライアントにテンプレートの変更権限が無い場合
%form_dataが例え汚染されていたとしても
重大な影響は与えないと思う。
とはいえ
hoge.cgi?mail=危険なタグ
とかされた場合、ブラウザクラッシュとかもありえるから
サニタイズは必要ですね
0920nobodyさん
05/03/07 09:27:19ID:???一応、出力時にエスケープできるオプションもある。
>>919
http://www.google.co.jp/search?q=XSS
0923nobodyさん
05/03/07 18:44:45ID:???perlソース側ではprint文、HTMLタグは一切記述せず(httpヘッダくらいはいいかな)
テンプレート側だけで対応する事になるのでしょうか。
速度や保守性を考えるとどのぐらいの割合がいいのかなと思いまして。
0924nobodyさん
05/03/07 19:55:37ID:???基本的に表示のための加工処理はテンプレートに集中させるべきだと思いますが。
ヘッダは本体スクリプトで。
0925nobodyさん
05/03/07 20:36:15ID:C7YlD7f8$remolog = './remolog.cgi';
のように./をつけているのを多く見ます。
./に何か御利益があるんですか?
0926nobodyさん
05/03/07 23:25:57ID:iIlEY0AB【やりたい事】
methodが post と get と 何もなし で分岐させたい。
【やってる事】
if( $ENV{'REQUEST_METHOD'} eq "GET" ){
hogehoge
}elseif( $ENV{'REQUEST_METHOD'} eq "POST" ){
hagehage
}else{
punipuni
}
【困った事】
エラーになります。分岐を2つ(GET と else、 POST と else)
にするとなぜかエラーになりません。
原因はなんなのでしょうか?よろしくお願いします。
0928926
05/03/07 23:32:09ID:???解決しました。ありがとうございました。
0929nobodyさん
05/03/08 00:18:06ID:???else if
とか
for(i = 0
とかやっちゃう
0930926
05/03/08 00:40:31ID:l83v9ZYFopen で 一つ上のディレクトリにあるファイルに書き込みを行いたいと思ってます。
ですが… open DATA "> ../hogehoge.txt";
としてもうまくいかないんです。なにがおかしいのでしょうか?
0932926
05/03/08 00:54:09ID:l83v9ZYFopen (DATA, "> ../hogehoge.txt");
これでうまくいかなかったのですが…
これに続く文は
print DATA "hagehage1\n";
print DATA "hagehage2\n";
…
close(DATA);
わかんないっす。
0934nobodyさん
05/03/08 01:10:31ID:???0935nobodyさん
05/03/08 01:12:22ID:???とりあえず
open (DATA, "> ../hogehoge.txt") or die $!;
とかしてエラーになるかどうか、エラーならどんなメッセージか
を確認することを薦める。というかopenにエラートラップするのは
基本だ。
0936926
05/03/08 01:30:33ID:???windowsのローカルのApache2ではパーミッションとかわかんないです。
プロバイダのはフォルダには書き込み権限設定してませんが、ファイルは666にしてます。
>>934
意味がわからないです。もうちょっと自分で調べます。
>>935
やってみます。
皆様、ありがとうございます。
0937926
05/03/08 01:33:05ID:l83v9ZYFInternal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
でした。たぶん前と変わりません。。。
0938926
05/03/08 01:35:23ID:???「CGI の内部エラーが発生しました。」と日本語表示されました。
こんな事していいのかな。。。
0939926
05/03/08 01:42:39ID:???原因は他にありそうです。m(_ _)m
0940926
05/03/08 01:59:17ID:l83v9ZYFprint DATA "<a href=\"http://";
print DATA "127.0.0.1";
print DATA "/\">今は入れないよ</a>\n";
こういうのを書いていたのですが、1行にするとエラーが回避されて正常動作するようになりました。
理由わからないです。
ダブルクォーテーション関係ありますか?
0941nobodyさん
05/03/08 03:08:26ID:???ようわからんけど、コマンドプロンプトじゃなくブラウザで動作確認してるみたいだから、
#- - - - - - - - - - - - - - - - - -
#!/usr/bin/perl
# use strict;
open (DATA , "> ../hogehoge.txt") || &error($!);
print DATA "<a href=\"http://"; # この辺は任意
print DATA "127.0.0.1";
print DATA "/\">今は入れないよ</a>\n";
close(DATA);
&error('OK!');
sub error {
$, = "\n";
print "Content-type: text/html\n\n";
print '<title>Error</title>', '<pre>', @_, '</pre>';
exit;
}
#- - - - - - - - - - - - - - - - - -
というファイルでも作って確認してみたら?
(「DATA」の部分を「SAVE」とかに変えたらできたりしないかね? 普通は関係ないけど)
0942nobodyさん
05/03/08 03:13:58ID:???0943nobodyさん
05/03/08 03:17:45ID:???0944nobodyさん
05/03/08 07:35:02ID:???0945nobodyさん
05/03/08 08:00:51ID:???use CGI::Carp qw(fatalsToBrowser);
しとけ。dieしたときのメッセージがブラウザにも出るようになる。
0946nobodyさん
05/03/08 15:24:44ID:???# no parentheses
$foo = new Foo $arg1, $arg2;
# parentheses
$foo = new Foo ($arg1, $arg2);
# arrow
$foo = Foo->new($arg1, $arg2);
のどの書きかたしてる?
parenthesesみたいにカッコつけると、
やっぱサブルーチンに見えて紛らわしいものなのかねー。
あー、
$foo = new Foo +($arg1, $arg2);
もあり? うーん。
0947926
05/03/08 15:42:14ID:???Premature end of script headers
でした。
0949nobodyさん
05/03/08 20:32:35ID:/HU/2hpG何となく3番目。
0950nobodyさん
05/03/08 21:01:58ID:???s/((?:\G|>)[^<]*?)foo/$1bar/g;
と書けますが、
・1回だけでいい(gオプションをつけない)
・最初にタグ以外の文字があるテキスト(そこにもマッチさせたい)
とした場合、どのように書いたらいいでしょうか。
なるべく速いほうがいいのですが。
0951nobodyさん
05/03/08 21:27:00ID:???0953nobodyさん
05/03/08 22:07:09ID:???use File::Find;
$dir = "C:\\WINDOWS\\Favorites";
find(\&print_file,$dir);
sub print_file{
print "$File::Find::name\n";
}
C:\WINDOWS\Favorites/test.html
みたいに表示されてしまうんですが、
C:WINDOWS\Favorites\test.html
みたいに表示したいんですけど
どうしたらいいんでしょうか?
0954nobodyさん
05/03/08 22:19:35ID:???0955nobodyさん
05/03/08 23:02:12ID:???0956nobodyさん
05/03/08 23:12:33ID:???0958nobodyさん
05/03/09 03:18:19ID:???$aaa =~ s/<.*>//i;
にしてたのですが、
<TD>あああ</TD>
こういう1行に2つ以上タグがあるところは除去されてしまうようです
ちゃんと<TD>あああ</TD>⇒あああにするにはどうすればいいですか?
0961nobodyさん
05/03/09 03:39:03ID:???ちなみにどうやったか書いてって〜
0962nobodyさん
05/03/09 06:39:54ID:???ヘッダを出力する前にプロセスが終了してる。
理由としては
1. HTTPヘッダを出力していない。
2. ヘッダを出力する前にエラーが起きている。
のどちらか。
1.は出力するように修正する。
2.はエラーログにperlのエラーが出力されているので、それを見て修正。
Apacheの場合、改行二回するだけでも、
デフォルトのcontent-typeを吐いてくれる。
(httpd.confをいじってなければtext/plain)
0963nobodyさん
05/03/09 15:42:37ID:TPYzASqD<?
require ("./test/index.html");
?>
これをperlで再現したいのですが、
是非方法を教えて頂けませんでしょうかorz
0966nobodyさん
05/03/09 15:53:39ID:???PHPくだスレでのレスは放置かYO。
それに、
「PHPではrequireはコレコレこういう機能がありますが、
Perlでそれを実現するにはどうしたらいいですか?」
って感じの質問の仕方が真っ当だと思うが。
0967nobodyさん
05/03/09 16:00:05ID:TPYzASqDすいませんでしたorz
あと、Perlでreqireを使ってphpを呼び出すことは可能でしょうか・・・?
require "./test/index.php";
print index("$index");
↑
これはphpでrequireを使ってindex.phpを呼び出したときの成功ソースです
perlでは失敗しましたorz
ちなみにindex.phpの構造はこんなかんじです
<?
function index($index) {
return "hello!";
}
?>
0968nobodyさん
05/03/09 16:03:53ID:???0972nobodyさん
05/03/09 16:38:24ID:???0973nobodyさん
05/03/09 16:42:30ID:bpuh5/Rpopen new, '>new.txt';
@data = split /\t/;
if($data[0] eq 'kawagoe'){
print new "$_";
}
これですと、データを全て新ファイルに記憶してしまいますが、
data[2](タブ区切り三つ目のデータ)だけを省いて記録するには
どのように書き換えたらよいでしょうか?
0975nobodyさん
05/03/09 17:25:19ID:ox3iJUQYセッションを組み込もうと思っています。
phpで発行したセッションはperlからは利用できないのでしょうか?
0977nobodyさん
05/03/09 17:59:25ID:???こういう馬鹿はほっとくに限る。
次の質問どうぞ↓
0980nobodyさん
05/03/09 19:07:34ID:???split せんでも、それくらいなら
s/^([^\t]*\t[^\t]*)\t[^\t]*/$1/;
とかでどうかな。
データが長い上何回も繰り返すんだったら、
index と substr でも組み合わせたらいいかと。
[2]だけじゃなく、何個も消すのだったら、@data を splice して join すればいいよ。
0982nobodyさん
05/03/09 19:09:56ID:???@csv = <CSV>
foreach (@csv){
処理
}
この処理で
・splitで分解してeq
・正規表現でマッチ
どちらが早いですか?
0983nobodyさん
05/03/09 19:39:04ID:???0986nobodyさん
05/03/09 20:06:10ID:???Perlで処理効率云々を言ってもなぁ
それもCGIレベルの話でどちらが云々いうなら、画像サイズなんかを極限まで
落としたほうがよほど効果的だよ。
0988nobodyさん
05/03/09 21:05:13ID:???$live = '<a href=\"*************\">現行スレ</a><br>':
〜〜〜
print "$live";
このようにしたのですがエラーがでます
なにか間違えたりたりないとこがあったらご指摘お願いいたします
0990nobodyさん
05/03/09 21:08:38ID:???0992nobodyさん
05/03/09 21:12:18ID:???予断ですが。
シングルクォーテーションの中でダブルクォーテーションはエスケープする必要ないし、
変数1つを出力するのに、ダブルクォーテーションでくくる必要もないです。
0993nobodyさん
05/03/09 21:15:04ID:???そんなのは<tag attr=>>を除去できるかと言っているのと同義。
$aaa =~ s/<[^>]+?>//is;
でFA?
0995nobodyさん
05/03/09 21:22:52ID:???レス数が950を超えています。1000を超えると書き込みができなくなります。