Perlコーディング初心者質問スレ Part 49
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/05/31(水) 04:32:28ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0642616
2006/06/19(月) 18:06:04ID:???なぁんとなく解ってきたようなきてないような。
$hoge = '質問スレ';
print "初心者$hoge";
と書くのは正しいけど、
$hoge = '初心者質問スレ';
print "$hoge";
と書くのは厳密には正しくない、みたいなことかな。
上の例で言えば、どうしてもダブルクォートで揃えたいなら
open(FILE, "$file");
とは書かず
open(FILE, "< $file");
と書いた方が文法的(?)にはオケってことか。
ちょっとスッキリした。サンキューです!
0643nobodyさん
2006/06/19(月) 18:18:13ID:???いや、正しい正しくないの話じゃなくて。例えば、0から9まで処理するときに
for my $i (0..9) { }
と書いても、
{ my $i = 0;
while ($i <= 9) { }
continue { $i++ }
}
と書いても文法的には正しいし、同じように動くけれど、
前者のほうが無駄が無いし、間違い起こしにくいでしょ?みたいな話かと。
0644nobodyさん
2006/06/19(月) 18:24:02ID:???> print "初心者$hoge";
これも
print '初心者', $hoge;
こうか
print '初心者' . $hoge;
こう書かない?
0645616
2006/06/19(月) 18:43:23ID:???そっちの解釈か!
ロクに入門書も読まず他人様の書いたコードを切ったり貼ったりしながら
適当に「学んだつもり」になってた人種にとっては耳の痛いお話ですわ。
システム面でのエラーが起こりにくい無駄のない書き方に拘泥して
稚拙なヒューマンエラー続発とか…自分には有り得そうで怖いなぁ。
とは言っても、そんなんでは進歩はないので心掛けて書き直すかな!
>>644
例が悪かったかもかも。
print "<SPAN STYLE=\"color:$hoge\">2ちゃんねる</SPAN>";
みたいなのを想定で。
0646nobodyさん
2006/06/19(月) 18:46:17ID:???0649nobodyさん
2006/06/19(月) 19:10:40ID:???んー。他の人も言ってるけどちと違う。
別にどっちで書いても文法的には正しいし動作もする。
"$file" みたいにダブルクォートで括ると(無名の)「文字列の生成」が起こる。
内容は$fileと全く同じ。
だったら新しく生成しなくても良いんじゃないの?って話。
同じもの2個作ってどうするよ。無駄だよね。
しかも、 open(FH, "$file"); じゃ、生成した所ですぐに使い捨て。
だったら open(FH, $file); の方が無駄な変数作らなくて良い。
まぁそんだけだけど。
0650616
2006/06/19(月) 19:41:40ID:???>"$file" みたいにダブルクォートで括ると(無名の)「文字列の生成」が起こる。
!!
先生『週刊そーなんだ』にも掲載すべきだと思います。
懇切丁寧な説明により、ようやく合点がいきました。
しかし、ラクダ本読むのには時間もだけど体力要るな…。
0651nobodyさん
2006/06/19(月) 22:55:15ID:Fr5nT8/Wちょっと知り合いのサイトを作ってあげよかなと思いまして、
いろいろ遊びたいのでとりあえず全部のページをCGIにしようと今メモ帳を眺めてるのですが。
プログラム本体にHTMLを書いていくとなんか物凄く長くなってしまいますよね。
でも10ページくらいでも1000行くらいは簡単に超えますね。
なんかそのやり方がすきになれないのですが、かといって.txtにhtml本文を書いておいて
読み込み手法も納得いかない。
出力内容を作成するルーチンだけ.plで別にしても結局はイマイチ。
読みやすく拡張しやすくスッキリとした手法をかなり神経質なレベルで考えていますが、
アドバイスもらえたらとおもって投稿しました。
少しコーディングから離れるというか、前段階の話になるので気が向いた方だけで
かまいませんので宜しくお願いします。
0652nobodyさん
2006/06/19(月) 23:06:33ID:???とりあえず HTML::Template でも使っとけ
0653nobodyさん
2006/06/19(月) 23:08:51ID:???最近Catalystばかりなのでわかんね。
0654651
2006/06/19(月) 23:12:39ID:Fr5nT8/WHTML::Templateは知っていますが、そういうことではないんです。
うまく説明できませんのでスルーしてもらってもm(__)mごめんなさい。
例えば普通にhtmlファイルのまま全部のページを公開してるとしますよね。
10ページだろうが100ページだろうが、拡張していくときに面倒はありませんし、
把握もとても単純なんですよね。
それをCGIにするとイマイチなんです。
スマートじゃなくなるというか。ゴミゴミするというか。
もちろん同じフォーマットの文章だけ違うような場合はいいのですが。
それぞれのページで違いますので。
0655nobodyさん
NGNG0657617
2006/06/20(火) 00:38:01ID:???> 安全措置が施されていて、use re 'eval';しないとデフォルトでは動かないんだこれが。
ウホッ! ありがと。
0658nobodyさん
2006/06/20(火) 01:00:18ID:???他を選択する合理的な理由がない場合、ファイルオープンには常に 3引数の open を使うのが良い習慣だと思います。
正しくは、「どんな場合でも、その必要がなければ 2引数の open を使わない」なんだけれど。
0659nobodyさん
2006/06/20(火) 01:21:04ID:???・共通する部品と各ページに固有の部品をそれぞれ抽出
・各部品をファイルに保存 # この時、プログラムから利用しやすい形で保存しておく
・CGI が叩かれた時に必要な部品を読込み、それらを組み合わせて返す
全リソースが静的なら、こーゆーのは SSI の仕事で CGI でやるメリットはないと思う。
抽出の粒度と保存スタイルさえ適切ならディスクの節約にはなるかもね。
0660nobodyさん
2006/06/20(火) 01:29:57ID:???ヒアドキュメント使えば、表示したいHTML+5行ぐらいでcgiに出来ますよね?
”拡張性がある”というのをどういう状況を指して言ってるのか分からないですが、・・・
0661nobodyさん
2006/06/20(火) 03:32:08ID:???Perlの練習の意味を込めて、今現在CGIでホームページを作成しています。
(ただ単に、HTMLを出力するだけのCGIです)
そこで質問なのですが、
「http://yomi.pekori.to/s/yomi.cgi?mode=kt&kt=02」の用な感じにページを分けたいのですが、考え方が分かりません。
自力で「http://yomi.pekori.to/s/yomi.cgi?mode=kt」まで分けることはできるのですが、
その後にさらに「&kt=02」を足して
「http://yomi.pekori.to/s/yomi.cgi?mode=kt&kt=02」というページを作成する方法が分かりません・・・ orz
正直、自分でやってもうまくいかないし、何て検索していいのかも分からず途方に暮れています・・・
よろしくお願いします。
0662nobodyさん
2006/06/20(火) 03:59:35ID:???CGI.pmを使ってるならparam('mode')、param('kt')で欲しい値が取れる
ので、それを条件にかければOK
0663nobodyさん
2006/06/20(火) 04:48:28ID:???自分のスクリプトではこんな感じにしてます。
$template{'##TITLE##'} = "TEST";
$template{'##CONTENTS##'} = "本文";
&templateprint("template.html", %template);
sub templateprint{
my($inputfile, %data) = @_;
my($templatetext);
if(open(FHTEMPLATE, $inputfile)){
read(FHTEMPLATE, $templatetext, (-s FHTEMPLATE));
close(FHTEMPLATE);
while (my($pos, $val) = each %data){
$templatetext =~ s/$pos/$val/gi;
}
}
print $templatetext;
}
※ ここに貼り付けるにあたってエラー処理とかはばっさり削除してます
0664nobodyさん
2006/06/20(火) 07:13:05ID:???テンプレート使うとかブラウザからページ作成する、とかでない限り無駄でしかないんだけどw
0665nobodyさん
2006/06/20(火) 07:27:32ID:???あと HTML 編集時のミスも極力防げるし。
サーバーの負担以外はプラス面ばかりだとは思う。個人的にはだけどね
0666651
2006/06/20(火) 08:03:26ID:5983Ww81例えば10ページ分を一つのファイルにまとめると物凄いうざくなりますよね。
HTML自体が長くても所詮は.htmlで保存公開してるならスッキリ感があるんですが、
それをひとつのファイルにまとめると最悪な感じなんです。
html的に最悪ということです。
見渡しにくいコード・ソースというのが嫌いなのです。
逆に外部ファイルが10個も20個もあるのもイヤなんです。
というジレンマなんです。
0667nobodyさん
2006/06/20(火) 08:27:29ID:???デザインなんてCSSファイル変えるだけじゃん。
テーブルレイアウトやってるならあれだけどね。
>>666
CGI でやること自体見渡しにくいし、何kbのCGIファイル作る気だよ・・・
テンプレートは嫌だって言うし・・・
もう、あれだ、perl より php でやったらw
0668nobodyさん
2006/06/20(火) 09:59:21ID:???普通に1つのページに対して、1個のCGIにすれば?
というかperlはヒア演算子があるから、既にHTMLが出来てるなら、
#!/dir/perl
print <<HTML;
content-type:xxxx
HTML
で、とりあえずすぐにcgiになる。で、なんか動的要素追加したかったら
前の部分にちゃちゃっと書けば、ある程度拡張できるし・・・
というか何を目指してるのかがいまいち分からない・・・
0669nobodyさん
2006/06/20(火) 10:21:31ID:???10ページ分のHTMLを一つのCGIファイルにまとめてたい。
でも、大きくなって見通しも悪いのでどうにかしたい。
複数ファイルは死んでも嫌。
回答:
HTML::Templateは変数にテンプレート入れて動かせるよ。
0671nobodyさん
2006/06/20(火) 11:57:30ID:???0672nobodyさん
2006/06/20(火) 11:57:50ID:???0673nobodyさん
NGNG動的なページっぽく見せてるお^^
0674nobodyさん
2006/06/20(火) 12:20:28ID:5Ut+7oeuセグメンテーションエラーになってperl.coreというファイルを吐いて死んでしまいます。
perl.coreというファイルは何に使うのでしょうか?
0675nobodyさん
2006/06/20(火) 12:26:38ID:???[ケース1]
Perlを熟知しているが無意識に「Perl(CGI) > HTML」というイメージにとらわれている。
[ケース2]
Perlはそこそこできるが、HTML::Templateについて実はよく理解していない。
[ケース3]
Perl習いたてで、Perlを万能低級言語であるかのような錯覚に陥っている。
[ケース4]
HTML、CSS、JavaScriptについて実はよく理解していない。
[ケース5]
そもそも、対象としているHTMLソース自体が汚いから誰がやってもまとまらない。
0676nobodyさん
NGNGアセンブラの知識があれば読めます
0678nobodyさん
2006/06/20(火) 12:39:34ID:???0679674
2006/06/20(火) 12:49:03ID:5Ut+7oeuとでています。
perl -dでデバッグを行ってみたのですが、ある部分でずっとCPUを100%使い切ったまま止まっているように見えます。
このperl.coreはどのように役立てればよいのでしょう?
ググっても参考になる情報が載っていないので‥
0680nobodyさん
NGNGデバッガ使って読んで下さい
0681nobodyさん
2006/06/20(火) 14:11:30ID:T0oahEq/ファイル($log)の中身を1行ずつチェックしながら処理する場合、
open ( FH, $log );
と開いたとして、
@array = <FH>;
$limiti = @array;
while ( $limiti > 0 ) {
処理;
$limiti --;
}
とするのと
while(<FH>){
処理;
}
とするのは同じこと?
どっちでもできるなら後者の方が無駄な変数無い分よろしい?
0682nobodyさん
NGNG0683nobodyさん
2006/06/20(火) 14:18:25ID:???明らかに前者は分かりにくい。ありえない。メリットも少ないし。
それでもメモリに展開するなら foreach (@array) {} にでもしなよ。
0684681
2006/06/20(火) 14:32:11ID:???後者の方法最近知ったんだけど、それまでずっと前者の方法でやってた・・・orz.
>明らかに前者は分かりにくい。ありえない。メリットも少ないし。
だよね!だよね!ハッキリ答えてもらえてかなりスッキリ。
しかも代替案まで出してもらって恐縮です。
どうもでした!
0685nobodyさん
2006/06/20(火) 14:44:49ID:???0686651
2006/06/20(火) 18:41:22ID:5983Ww81CSSレイアウトは正確に書いても正確にレンダリングされるわけではありませんので、
バグ対応を考えるとテーブルレイアウトの方がよほどデザインの変更は私にとっては簡単です。
0687651
2006/06/20(火) 18:54:06ID:5983Ww81ケース6
ある一つのファイルを開けた時の見渡しやすさを確保するには一ページずつhoge.cgiにすれば
.htmlほどではないが準じたレベルで解決。
でもそれだとperlとしてボツ。
要は見渡しやすさと効率と利便性と拡張的と省エネと論理的という理想がそれぞれで
ぶつかりあって毎度動きはするけど納得いかないレベルのものになってしまうのです。
ここらでこのジレンマを解決したいのですが。
strictHTMLと作る側の利便性と効率的且つ拡張的なHTMLは反発しますよね。
そんな感じかもしれません。
m(__)m
0688nobodyさん
NGNG↓
高負荷でレスポンス激重or鯖缶から垢デリ
↓
水の泡
0689651
2006/06/20(火) 19:19:53ID:5983Ww81いや。まあかまわないのですがそれも。
作る自体遊びなので。
0690nobodyさん
2006/06/20(火) 19:37:08ID:???b;b1;10
c;c1;10
と記述したファイルがあるのですが、
例えばb;b1;10の10を11に書き換えたい場合はどうすればいいのでしょうか?
0691nobodyさん
2006/06/20(火) 19:40:22ID:???0692nobodyさん
2006/06/20(火) 19:45:22ID:???ファイルじゃなくてどうゆうふうに変数に入れてるのか家
まぁ、データ整理がうまく言ってないだけだと思うけど、たぶん想像だけど無難なトコでは
@file = (
['a', 'a1', 10],
['b', 'b1', 10],
['c', 'c1', 10],
);
って感じでいいのか?
だとしたら
$file[1][2]++;
となる
0693nobodyさん
2006/06/20(火) 20:02:06ID:???データファイルなりなんなりで保存しておいて、Apacheのmod_rewrite使って
自動的にCGIにパスを渡すようにするかなー
ってこれブログじゃねえか!
0694nobodyさん
NGNG0695nobodyさん
2006/06/20(火) 20:09:48ID:???Perlは初心者レベルの俺から見ても、
外部にhtmlの共通部分をテンプレートとして用意しておいて、
コンテンツをそこに流し込むだけでいい気がするんだけど。
>>686
それはCSSを知らないだけじゃない?
よっぽど変なレイアウトをしない限り、CSSハックとかちょっと組み合わせれば
主要ブラウザの表示の差異ぐらい普通に取り除けるぞ。
IE7でちょっと混乱しそうだが、IE7でCSSハックもできるようだから問題ないだろうし。
0696nobodyさん
2006/06/20(火) 20:12:07ID:???ファイルを読み込んで該当の一行を返し、それを;でsplitしています
ですので、変数としては@datに配列として入っています。
その@datの値を変更したのですが、ファイルに書き戻す方法がわかりません
0697nobodyさん
NGNG0698nobodyさん
2006/06/20(火) 20:23:24ID:???マッチした行をsedしたいのですが
0699698
2006/06/20(火) 20:25:48ID:???s///です。
0703651
2006/06/20(火) 21:04:52ID:5983Ww81いえ、htmlのソースは十分見やすいのです。
ただ、それを一つにまとめると長くなって見渡しやすさがなくなるのです。
>>693
昔携帯用サイトをそんな感じで作りました。
>>695
それはCSSに適したレイアウトをしてるからじゃないですか?
デザインレベルの段階で「これはCSSだと云々」と考えたりするのは
個人的には邪道なのです。
例えば写真がページごとに入る枚数が違って、写真と文字の位置の関係や
回り込みの仕方。文字のサイズを変えたときのかわり方、全体の長さによる背景の可変。
そして久しぶりにソース、コードを見た時のわかりやすさ。論理的でありながら効率的で。
長くお邪魔してしまいましたが、スレ汚しになってしまいますのでここらへんで消えます。
ありがとうございました。
0705651
2006/06/20(火) 21:17:35ID:5983Ww81例えば
my $print_value;
if ($form{page} eq "index"){ $print_value = &tag_index}
と本文でやってインデックス用のページを作るサブルーチンから完成したソースを
返してくるとしますよね。
これでページがindexとblogとgalleryと3種類だけでもソースを返してくるルーチンを
3つ同じファイル内に書くと見渡しにくくなりますよね。
最高の解決としては。これはメモ帳レベルの問題なのですが、
同じファイルに書いておきながら
#このルーチンはどういう処理をして何を返すのかを軽く説明
sub tag_index{} ### このルーチンの中身を見るにはココをクリック!
こんな感じになれば最高なんです。これで10個のルーチンがあっても30行ほどでよくなります。
つまり10個のルーチンが画面内に収まるのですから処理の全体の流れがとてもわかりやすいのです。
これが私のいう見渡しやすさです。
外部にライブラリにすればいい。モジュールにすればいい。
いや。違うんです。ファイルをいくつも作るのはゴミゴミして嫌いなんです。
そして毎度引数を色々渡すのも嫌いなんです。
って、こんなメモ帳を自分で作ればいいのか・・・・・・・
terapadを使ってるのですが、このインターフェースに慣れてるので
サブルーチンはデフォルトでは表示されないとかになればいいのに。行数はもちろんトビトビになる仕様で。
0706nobodyさん
NGNG0707nobodyさん
2006/06/20(火) 21:19:55ID:???0708nobodyさん
2006/06/20(火) 21:20:03ID:???ファイル複数にするのも邪道
HTML::Templateは使いたくない
これじゃどうしようもない…。
>>651 は何がしたかったんだろう。
0709nobodyさん
2006/06/20(火) 21:22:25ID:???っていう質問だったのか。。。
0710nobodyさん
NGNG0711nobodyさん
2006/06/20(火) 21:27:06ID:???その辺も普通にCSSで実現できるな。
tableデザインにはそれなりのメリットがあるのはわかるが、
貴方は多分CSSデザインを過小評価しすぎてるよ。
否定するならちゃんと勉強してからがお勧め。
0714651
2006/06/20(火) 21:34:10ID:5983Ww81そういうエディタもあったのですか。
しょぼい結末になってすみませんです。
>>711
そうでしたか。CSSスレで回答者をしていたころはよく回答者同士で
実装について嘆いたものですが。
1年ほどCSSから離れていたあいだにブラウザに革命でもおきて全て解消されたのでしょうか。
失礼いたしました。
0715nobodyさん
2006/06/20(火) 21:35:11ID:???0716651
2006/06/20(火) 21:40:19ID:5983Ww81優しくしてくれてありがとうございました。
0717nobodyさん
2006/06/20(火) 21:59:49ID:???0718nobodyさん
2006/06/20(火) 22:01:41ID:???0719nobodyさん
2006/06/20(火) 22:14:59ID:???ファイルを直接書き換えたいので、
open( FILE, ">>./dat/img_data.dat");
while(<FILE>){
s/$FORM{'tmp'}.*/$dat/;
print;
}
close( FILE);
このようにしているのですが、うまく動きません
原因がわかるかたいますでしょうか?
0722nobodyさん
2006/06/20(火) 22:22:13ID:???最後まで言ってることチンプンカンプンだったな。
どうでもいいけど、strict-HTMLとかCSSとかを心底使いこなせるほど覚えたのに、でもテーブルレイアウトのがいい、って言う人はじめて見た。
0724nobodyさん
2006/06/20(火) 22:27:29ID:???CSSハック駆使してその程度のデザインが出来ないっておかしい
amazonがまさにやりたいデザインを実践してるように見えるし
0726nobodyさん
2006/06/20(火) 22:32:50ID:???>>719
解決法そのいち:(メモリ喰うけど簡単だよ!)
配列に一回読み込んでから好きに書き換え、同じファイルに書き出す
解決法そのに:(メモリ喰わないけどちょっと面倒だよ!)
INとOUT、二つのファイルハンドルを作り、INで一行読んで好きに書き換え、OUTに書き出す
全部終わったら元ファイルを削除し、新ファイルを元ファイルと同じ名前にリネーム
0727nobodyさん
2006/06/20(火) 22:36:01ID:???>>719
> open( FILE, ">>./dat/img_data.dat");
追加書き込みで open してるのに
> while(<FILE>){
読もうとしてる。
しかも出力してるのはファイルじゃなくて
> print;
標準出力
そりゃうまく動かない。
というかこれが通るperlって凄いな。ある意味。
0729nobodyさん
2006/06/20(火) 22:37:42ID:???ここを直しても動かないけど、明らかにおかしいところ。
そのいち:
open( FILE, ">>./dat/img_data.dat"); は、追記オープンでしょ。
そのに:
print; は標準出力でしょ。少なくとも print FILE $_; にしないとFILEの意味がない!
と書いてたら>>727に先を越された。
>>728
意味が分からない。
0731nobodyさん
2006/06/20(火) 22:51:15ID:???0732nobodyさん
2006/06/20(火) 22:54:19ID:???0733nobodyさん
2006/06/20(火) 22:56:30ID:???とW3C信者の俺が言ってみる
0734nobodyさん
2006/06/20(火) 22:58:09ID:???この部分のことかね?
0736nobodyさん
2006/06/21(水) 01:11:43ID:???0737nobodyさん
2006/06/21(水) 12:25:23ID:Jpc8QU0aという情報が入っている。
・これを「住所」でソートして結果を出力(都道府県別という程度のソート)。
・その際、ブラウザにはフォームで選択した項目の情報だけを吐き出す。
ということをやりたいんですが、
1.openしてwhileで1行ずつ配列(@temp)に入れて処理。
1-1.フォームで選択されていないものを@tempからspliceして除去。
1-2.全ての都道府県にあらかじめ番号を付けておき、
$temp[4]に当たる値とマッチングさせて、unshiftで@tempの頭にその番号を付ける。
1-3.@newdataに@tempをpushで追加していく。
2.@newdataをソートして出力。
という方法しか思いつきませんでした。
でも、これだと不要な項目をループ処理の中で1回1回チェックしていて
ものすごく無駄なことをしている感じがします。
ファイルを開く前に必要な項目をチェックしておいて、
ファイルを開くときにはそれだけを取り出して処理する、
ということはできないでしょうか?
0739737
2006/06/21(水) 12:56:08ID:Jpc8QU0aありがとうございます。
それにしても「自分で決めた順番でソートする」という
ピンポイントな文章で結果が出るとは・・・。
しっかりブックマークして読んできます。
0740nobodyさん
2006/06/21(水) 13:10:47ID:QAUqj+Eucvs?といいますか、特定の文字で区切られた(12個)ファイルを読み込んで
二次元配列に入れて、処理をしたい。
2: それでこんな風にやってみたが・・・
for文(i++)で行を読み込んでから、それをさらにfor文(j++)で区切りずつに
わけ、その都度$list[$i][$j]に入れていくようにしました。
3: こんなエラーが出て上手く行かなかった。
12行目に来たところで突然ちゃんと配列に入らなくなってしまいました・・・。
読み込むファイルに原因があるのかと思い、1行から20行まで同じ内容のファイルを作ったのですが
同じように読み込めませんでした・・・。どのようなことが原因と考えられるでしょうか・・・?
■ このスレッドは過去ログ倉庫に格納されています