Perlコーディング初心者質問スレ Part 40
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001nobodyさん
05/01/27 18:08:42ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0877nobodyさん
05/03/04 22:40:30ID:???Windowsの「メモ帳」がShift_JISにしか対応してないことと、
テキストエディタ上で設定する必要があることに起因しているようですね。
ありがとうございます。
0878nobodyさん
05/03/04 23:28:05ID:???http://www.perldoc.com/perl5.8.0/pod/func/dbmopen.html
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perltie.html
http://www.att.or.jp/perl/man/anydbmfile.3pm.html
0880nobodyさん
05/03/05 00:22:28ID:???globの半角スペースは、OS依存でなくglobの仕様
glob '/usr/*/*/* /bin/* /etc/*/*';
という記述もできるようになっている。
半角スペースをファイル名の一部とみなしてほしい場合は
半角スペースの直前にバックスラッシュ(円マーク)を記述して
エスケープすればよい。
0881nobodyさん
05/03/05 02:58:35ID:hbhM7+40まずグーグルの使い方を覚えようね。
http://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=%E6%94%B9%E8%A1%8C%20%E5%A4%89%E6%8F%9B+textarea&num=50
0882nobodyさん
05/03/05 09:42:12ID:???エロい人おしえてください
0883852
05/03/05 11:08:25ID:???エスケープは何度も試したんですが・・・・
どうやらシングルクォートでやらないといけないようですね。
"/Documents\ and\ Settings/a/*"
これではダメで
'/Documents\ and\ Settings/a/*'
これだといけました。そうなってくるとperlとしては半角をエスケープしてないことに
なるんだけどな・・・よくわからん。
0885nobodyさん
05/03/05 12:34:00ID:???ダブルクォートだと glob に渡る前にエスケープが解釈されちゃうだろ。
sub hd { join ' ', map uc unpack('H2', $_), split //, $_[0] }
print hd("/Doc\ and\ Set/a/*"), "\n";
print hd("/Doc\\ and\\ Set/a/*"), "\n";
print hd('/Doc\ and\ Set/a/*'), "\n";
0886nobodyさん
05/03/05 14:24:31ID:???jcode.plがUnicode非対応。
自力でやるにも文字コードの判別、変換が困難。
Perl5.8以降限定や、Jcode.pm必須にするか、
文字コードのチェックを行わなければ大丈夫だろうけど、
そこまでしてUTF-8にこだわる理由が見出せない。
でも、XHTMLが主流になれば、移行していくと思うよ。
0887nobodyさん
05/03/05 14:38:07ID:???配布するスクリプトはまあいろいろ難しいだろうな
0888nobodyさん
05/03/05 15:02:07ID:???$tmp = 'http://foo/bar/1234.jpg';
$pat = '(.*)\.jpg';
$rep = '\1.png';
$tmp =~ s/$pat/$rep/;
print "$tmp\n";
これだと、「\1.png」としか表示されません。
置換の所を、
$tmp =~ s/$pat/\1.png/;
にすれば期待通りの結果がでますが、どうすればいいのでしょうか。
パターンも置換文字列も変数を使用したいです。
0889nobodyさん
05/03/05 15:02:38ID:???0890nobodyさん
05/03/05 15:26:50ID:???メモ帳で UTF-8が開けるの初めて知ったよ(Win2000)
でもデフォはSJISだから95とかMeが廃れても無理っぽい。
0891nobodyさん
05/03/05 15:36:58ID:???スクリプト開発者はさすがにメモ帳デフォのままでコーディングしないっしょ?
0892nobodyさん
05/03/05 16:06:25ID:???$tmp = 'http://foo/bar/1234.jpg';
$pat = '(.*)\.jpg';
$rep = '$1.".png"';
$tmp =~ s/$pat/$rep/ee;
print "$tmp\n";
0894nobodyさん
05/03/05 17:11:23ID:???自分しか使えないスクリプトほどくだらないもんはない。
誰でも使えるものを作れるかどうかが、馬鹿とアホの分かれ道なわけで。
そもそもヘタレが多すぎだな。
環境によって書き換えてもらわないといけないなんてアホくさい。
普通は設定ファイルは別途にしておいて、その設定ファイルをいじるための
インターフェースも作っておく。
プログラムなんてのは他人に書き換えてもらう事を前提にするようなもんじゃない。
想定をこちらで決めてしまわなければどうしようもない。
0895nobodyさん
05/03/05 17:15:36ID:???重いとか聞いたのでまだ使ったことありません。
それにテンプレートを作るってことは変数が乱立せざるを得ないし、
構文を埋め込みok状態で使うならテンプレートファイルを別に作る意味も不明。
とか思ってるんですが、使用されてる方の意見を利かせて下さい。
今は基本的にHTMLはプログラム内にあります。まあ出力内容を作成する
ルーチンなので外部に置いてもなんら問題はありませんが。
逆に差がないなら分ける意味もないですうしね。
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からは利用できないのでしょうか?
レス数が950を超えています。1000を超えると書き込みができなくなります。