Perlコーディング初心者質問スレ Part 49
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/05/31(水) 04:32:28ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
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行まで同じ内容のファイルを作ったのですが
同じように読み込めませんでした・・・。どのようなことが原因と考えられるでしょうか・・・?
0741nobodyさん
2006/06/21(水) 13:21:16ID:???Perlメモには多くの人がお世話になっているはず。
そのページの他の項目も非常に為になりますよ。
>>740
どんなエラーですか・・・
0743737
2006/06/21(水) 13:46:58ID:Jpc8QU0aこれはとても勉強になりそうです。
逆引きなのが助かります。
ところで、>>738にて指摘してもらった箇所を参考にしてみたんですが
>>737に即して書き直すと
$i = 0;
undef(%jusho);
foreach $name ('北海道', '東京', '愛知', '', '大阪', '福岡') {
$jusho{$name} = $i++;
}
@data = map {$_->[0]}
sort {$jusho{$a->[5]} <=> $jusho{$b->[5]}}
map {[$_, split /<>/]} @data;
というふうになるかと思うんですが、「住所」の項には都道府県以下の内容も含まれているので、
この方法で対処しようとすると「住所」の項とは別に「都道府県」の項を設けるか、
住所を「都道府県」と「それ以下」とに分けなければダメですよね?
これはこれで大変便利で、参考になりましたが、
今の記述内容のファイルでは、やはり>>737の方法しかないんでしょうか?
0744nobodyさん
2006/06/21(水) 13:49:01ID:???マッチする前の部分も表示されました。
一応$& $'と書くことで、自分のやりたいことはできてるんですが、
なぜこうなるのか気になります。
何か特別な理由があるんでしょうか?
0745nobodyさん
2006/06/21(水) 13:49:48ID:???別に20行目とか多次元配列で何か起こるってことはないと思う。
どうみても処理のせいです。
同じように多次元配列(ハッシュ) にいれるモジュール作ったけど、そんなことは起きなかったし。
データが shiftjis で、その特定のマーカーと知らないうちにかぶってるとか。
0747nobodyさん
2006/06/21(水) 14:00:01ID:???応用しようぜw
@data = map {$_->[0]}
sort {$jusho{$a->[1]} <=> $jusho{$b->[1]}}
map { my @tmp = split(/<>/); $tmp[5] =~ /^(.*?)(?:県|都|府|道)/; [ $_, $1] } @data;
まあニュアンスね。試してないけど。
0748nobodyさん
2006/06/21(水) 14:00:50ID:???sort {$jusho{$a->[1]} <=> $jusho{$b->[1]}}
↓
sort {$jusho{$a->[1]} cmp $jusho{$b->[1]}}
0749737
2006/06/21(水) 14:20:59ID:Jpc8QU0a>sort {$jusho{$a->[1]} cmp $jusho{$b->[1]}}
これは「名前」でソートするってことですか?
>$tmp[5] =~ /^(.*?)(?:県|都|府|道)/; [ $_, $1]
この部分が分かりません・・・。
簡単にで良いので解説を・・・。
0750nobodyさん
2006/06/21(水) 14:35:16ID:???()の中身を取って$1に入れときたいのです。
0752nobodyさん
2006/06/21(水) 14:44:47ID:???0753737
2006/06/21(水) 14:54:48ID:Jpc8QU0a解説ありがとうございます。
とすると、
>>747の処理をして一旦「都道府県」だけを取り出して>>743の処理をする
という解釈で良いんでしょうか?
それとも>>743のコードの6行目以下を>>747のニュアンスのように書き換える
ということなんでしょうか?
京都府に関しては岸部四郎に免じてお許しを。
0754nobodyさん
2006/06/21(水) 15:02:29ID:???0755nobodyさん
2006/06/21(水) 15:11:00ID:???0756737
2006/06/21(水) 15:19:55ID:Jpc8QU0a0757nobodyさん
2006/06/21(水) 15:26:09ID:???0758nobodyさん
2006/06/21(水) 15:27:40ID:???0759nobodyさん
2006/06/21(水) 15:33:54ID:???0760nobodyさん
2006/06/21(水) 15:40:10ID:???0761nobodyさん
2006/06/21(水) 15:42:59ID:???0762nobodyさん
2006/06/21(水) 15:47:58ID:???HTTP上の問題は今になって考えればなかっただろうが。
UAでの解釈問題はあるかもな。
今の出力コードでおすすめは何?
c-HTMLではSJIS onlyなi-modeも拡張されたの?
0763nobodyさん
2006/06/21(水) 15:50:04ID:???0764744
2006/06/21(水) 15:51:28ID:sa5CDJCkすみません、こんな感じです。
$euc_regex = "(?:$ascii|$two_bytes|$three_bytes)*?";
#検索
while (chomp ($_ = <IN>)) {
if (/<DOCID>(.+)<\/DOCID>/) {
$docid = $1;
}
if (/<TITL>(.+)<\/TITL>/) {
$title = $1;
}
if (/<AUTHOR>(.+)<\/AUTHOR>/) {
$author = $1;
}
if ($form{'tosho1'} eq "all") {
if (/^$euc_regex($key1)/) {
$found++;
print "ID=$docid TITLE=$title AUTHOR=$author<BR>\n";
print "$& <BR>\n<BR>\n";
}
}
}
0765744
2006/06/21(水) 15:52:07ID:sa5CDJCk………石
のように表示されます。
質問は「なぜ$&を使ったのにマッチした部分以前も表示されてしまうか」です。
最低限がどれくらいかわからなかったんですが、
もっとソースの大部分を書いたほうがいいでしょうか?
0766nobodyさん
2006/06/21(水) 15:55:04ID:???メールも7bitだけだしなー。
携帯のブラウザのプログラマはほんと何考えて作ってんだと思うよ。
0767nobodyさん
2006/06/21(水) 15:55:41ID:???0768nobodyさん
2006/06/21(水) 15:56:15ID:???$euc_regex = "(?:$ascii|$two_bytes|$three_bytes)*?";
ちょw おまwww
0769nobodyさん
2006/06/21(水) 15:59:46ID:???> $euc_regex = "(?:$ascii|$two_bytes|$three_bytes)*?";
> if (/^$euc_regex($key1)/) {
え、当たり前では。
「石」で検索かけるってことは、$key1 = "石"なんだよね。多分。
このとき正規表現は
/^(?:$ascii|$two_bytes|$three_bytes)*?(石)/
なんだから、$&ではマッチした部分全部が取れる。
"石"だけ取りたいなら $& じゃなくて $1 でしょう。
0770737
2006/06/21(水) 16:30:27ID:Jpc8QU0a$i = 0;
undef(%jusho);
foreach $name ('北海道', '東京', '愛知', '', '大阪', '福岡') {
$jusho{$name} = $i++;
}
@data = map {$_->[0]}
sort {$jusho{$a->[1]} cmp $jusho{$b->[1]}}
map { my @tmp = split(/<>/); $tmp[4] =~ /^(.*?)(?:県|都|府|道)/; [ $_, $1] } @data;
ラスト3行については下から処理してるんですよね?
なぜ、正規表現で取り出した()の中身を$1に入れて
sort {$jusho{$a->[1]} cmp $jusho{$b->[1]}}となるのか分かりません。
岸部四郎の件で気分を害されたならお詫びします。
0771nobodyさん
2006/06/21(水) 16:36:13ID:???解読してみる。
$jusho{ $a->[1] }
・↑の $a の部分は [ $_, $1 ] である、
・つまり $a は [ 元のデータ , 県名 ]
・なので、 $a->[1] は 県名
・$jusho{ $a->[1] } は
$jusho{ 県名 } ということ。
あってる?
0772737
2006/06/21(水) 17:07:18ID:Jpc8QU0a解説ありがとうございます。ラスト3行の意味がやっと理解できました。
そうすると、ハッシュとして割り当てる名前にも都道府県を付ける必要があるわけですね。
$i = 0;
undef(%jusho);
foreach $name ('北海道', '東京都', '愛知県' , '大阪府', '福岡県') {
$jusho{$name} = $i++;
}
@data = map {$_->[0]}
sort {$jusho{$a->[1]} cmp $jusho{$b->[1]}}
map { my @tmp = split(/<>/); $tmp[4] =~ /^(.*?)(?:県|都|府|道)/; [ $_, $1] } @data;
としてみましたが、やはりうまくいきません…。
ちなみに読み込む@dataに入っている情報は
岸部4郎<>57<>男<>077-XXXX-XXXX<>京都府京都市伏見区・・・<>
のような形態です。
0773nobodyさん
2006/06/21(水) 17:07:26ID:???公開資料上で全機種対応なのはSJIS。
だが実際は、ほとんどの機種は四大エンコードに対応している。
>>766
糞仕様を決めたのはドコモ。
0775nobodyさん
2006/06/21(水) 17:50:44ID:???鵜呑みじゃなくて、ちょっと考えて流用しようよ。
>>747 のコードが間違ってるんだってば。
本人ニュアンスだけで試してないって書いてあるし。
それと >>751 も忘れずに。
0776nobodyさん
2006/06/21(水) 18:05:31ID:???>>743 に ('北海道', '東京', '愛知', '', '大阪', '福岡') ってあったけど
今度 ('北海道', '東京都', '愛知県' , '大阪府', '福岡県') ってしてるのに、コード変えてないから・・
その場合 /^(.*?(?:県|都|府|道))/ こうねw
まあ京都府問題あるけどね。
0777nobodyさん
2006/06/21(水) 18:06:54ID:???0778nobodyさん
2006/06/21(水) 18:10:36ID:???('北海道', '東京都', '愛知県', '京都', '大阪府', '福岡県')
うわー頭の悪い解決法w
漏れの出生地だったりもします♪
そういや本7も京都府、、、
0780nobodyさん
2006/06/21(水) 19:54:18ID:???0781740
2006/06/21(水) 21:36:56ID:YEOwQDJjこんな感じです。
while (<SOCKET>){
m/ここから後ろが12行で一区切り/ and last;
}
for ($i = 0 ; $i < 100; $i++ )
{
for ($j = 0 ; $j < 13; $j++ )
{
$list[$i][$j] = <SOCKET>;
}
}
[12][5]ぐらいあたりから次に([12][7])ずれてしまいます・・・。
[12][4]までは、ちゃんと入っています。データはeuc-jp?でした。
0782nobodyさん
2006/06/21(水) 21:48:58ID:???$j は 13個で回ってるんだがそれはOKなの?
0783nobodyさん
2006/06/21(水) 21:56:27ID:???ですよねぇ。。。
SOCKETなんて名前を使っているところを見ると何かしら通信しているのかしら?
となると、改行問題とかもありそうな。
しかし、whileでSOCKETを読み捨てているのもなんだかなぁ。。。
0785nobodyさん
2006/06/21(水) 23:05:30ID:???ユーザディレクトリ内に任意のディレクトリ構造を作って利用できます。
ユーザディレクトリ内はCGI経由で閲覧しますので、画像などもCGI経由でバイナリで書き出そうと思い
実際やってみたのですが、画像へ直リンク張るのに比べ、格段に表示が遅いです。
よく、画像の無断直リンク防止のためにCGI経由ってのはあると思うのですが、上記のように、
サイトの全画像をCGI経由ってのは設計としてよろしくないのでしょうか。
0786nobodyさん
2006/06/21(水) 23:08:34ID:???1ページでプロセスいくつ使ってると…。
0787785
2006/06/21(水) 23:11:12ID:???HTTPで通信してデータ取得する場合、一行のサイズに限界があるから、
サーバ側が勝手に(というか仕様に基づいて)改行コードを入れる可能性がある。
サイズが長い行でずれてるのでは?
■ このスレッドは過去ログ倉庫に格納されています