トップページphp
1001コメント371KB

Perlコーディング初心者質問スレ Part 49

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2006/05/31(水) 04:32:28ID:???
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
0763nobodyさん2006/06/21(水) 15:50:04ID:???
メールは7bitだけど、HTTPで7bitなんて聞いた事無いなぁ
07647442006/06/21(水) 15:51:28ID:sa5CDJCk
>>746
すみません、こんな感じです。

$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";
  }
 }
}
07657442006/06/21(水) 15:52:07ID:sa5CDJCk
挙動はたとえば石で検索した場合、
………石
のように表示されます。

質問は「なぜ$&を使ったのにマッチした部分以前も表示されてしまうか」です。

最低限がどれくらいかわからなかったんですが、
もっとソースの大部分を書いたほうがいいでしょうか?
0766nobodyさん2006/06/21(水) 15:55:04ID:???
なるほ(´・ω・`)
メールも7bitだけだしなー。

携帯のブラウザのプログラマはほんと何考えて作ってんだと思うよ。
0767nobodyさん2006/06/21(水) 15:55:41ID:???
contentのencode見ずに、mailに変換して配信するgatewayでもいたんですかね。
0768nobodyさん2006/06/21(水) 15:56:15ID:???
>>764
$euc_regex = "(?:$ascii|$two_bytes|$three_bytes)*?";

ちょw おまwww
0769nobodyさん2006/06/21(水) 15:59:46ID:???
>>765
> $euc_regex = "(?:$ascii|$two_bytes|$three_bytes)*?";
> if (/^$euc_regex($key1)/) {

え、当たり前では。
「石」で検索かけるってことは、$key1 = "石"なんだよね。多分。

このとき正規表現は
/^(?:$ascii|$two_bytes|$three_bytes)*?(石)/
なんだから、$&ではマッチした部分全部が取れる。
"石"だけ取りたいなら $& じゃなくて $1 でしょう。
07707372006/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{ 県名 } ということ。

あってる?
07727372006/06/21(水) 17:07:18ID:Jpc8QU0a
>>771
解説ありがとうございます。ラスト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:???
>>762
公開資料上で全機種対応なのはSJIS。
だが実際は、ほとんどの機種は四大エンコードに対応している。
>>766
糞仕様を決めたのはドコモ。
0774nobodyさん2006/06/21(水) 17:39:12ID:???
>>772
こらっ!
「京都府京都市伏見区」って俺の住所と同じじゃんか。
0775nobodyさん2006/06/21(水) 17:50:44ID:???
>>772
鵜呑みじゃなくて、ちょっと考えて流用しようよ。
>>747 のコードが間違ってるんだってば。
本人ニュアンスだけで試してないって書いてあるし。
それと >>751 も忘れずに。
0776nobodyさん2006/06/21(水) 18:05:31ID:???
>>772
>>743 に ('北海道', '東京', '愛知', '', '大阪', '福岡') ってあったけど
今度 ('北海道', '東京都', '愛知県' , '大阪府', '福岡県') ってしてるのに、コード変えてないから・・
その場合 /^(.*?(?:県|都|府|道))/ こうねw
まあ京都府問題あるけどね。
0777nobodyさん2006/06/21(水) 18:06:54ID:???
それと、cmp じゃなくて <=> のままでよかったw
0778nobodyさん2006/06/21(水) 18:10:36ID:???
ちなみに、京都だけ "京都府" じゃなくて "京都" ってやればおk

('北海道', '東京都', '愛知県', '京都', '大阪府', '福岡県')

うわー頭の悪い解決法w
0779 ◆TWARamEjuA NGNG
>>774
漏れの出生地だったりもします♪

そういや本7も京都府、、、
0780nobodyさん2006/06/21(水) 19:54:18ID:???
素直にデータファイルの構造を変えれば済むのに・・・
07817402006/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:???
うちも何言ってるかさっぱりわかんねえ。。。
0784 ◆TWARamEjuA NGNG
日本語で桶。
ですよねぇ。。。

SOCKETなんて名前を使っているところを見ると何かしら通信しているのかしら?
となると、改行問題とかもありそうな。

しかし、whileでSOCKETを読み捨てているのもなんだかなぁ。。。
0785nobodyさん2006/06/21(水) 23:05:30ID:???
WEBのテンプレートシステムを作ってます。

ユーザディレクトリ内に任意のディレクトリ構造を作って利用できます。
ユーザディレクトリ内はCGI経由で閲覧しますので、画像などもCGI経由でバイナリで書き出そうと思い
実際やってみたのですが、画像へ直リンク張るのに比べ、格段に表示が遅いです。

よく、画像の無断直リンク防止のためにCGI経由ってのはあると思うのですが、上記のように、
サイトの全画像をCGI経由ってのは設計としてよろしくないのでしょうか。
0786nobodyさん2006/06/21(水) 23:08:34ID:???
それはそうでしょう。
1ページでプロセスいくつ使ってると…。

07877852006/06/21(水) 23:11:12ID:???
>>740
HTTPで通信してデータ取得する場合、一行のサイズに限界があるから、
サーバ側が勝手に(というか仕様に基づいて)改行コードを入れる可能性がある。
サイズが長い行でずれてるのでは?
0788nobodyさん2006/06/21(水) 23:15:33ID:???
>>786
ですよね・・。既存のテンプレートシステムってどうやってるのか調べてみます。
07897402006/06/21(水) 23:56:42ID:???
>>785
仕様でしたか・・・。
情報ありがとうございます。
どーにかしてみます。
0790nobodyさん2006/06/22(木) 00:07:54ID:???
>>789
いや、ファイルから読んでるんでしょ?HTTPじゃないじゃん。
0791nobodyさん2006/06/22(木) 00:09:28ID:???
>>789
本当にあのコードで12行目まで動いてるのだとしたら、
何がやりたいのか分からんのでお手上げだが。
やりたいのは実はこういうことじゃないのか?
while (<SOCKET>){ chomp; push @list, [(split /特定の文字/, $_)[0..11]]; }
0792nobodyさん2006/06/22(木) 00:58:05ID:???
>786
.htaccess が利用できるなら
<FilesMatch "\.(gif|jpe?g|png)$">
  SetEnvIf Referer "^$" shutout
  Deny from env=shutout
</FilesMatch>

でどうです?
0793nobodyさん2006/06/22(木) 00:58:34ID:???
まちがえた
>785 宛でした
0794nobodyさん2006/06/22(木) 00:59:58ID:qN5f1h6g
今現在、掲示板を作成しています。そこで質問があります。
まず下のコードは、見ていただければ分かると思いますが、
「$come」や「$name」などが未記入であった場合、「&error」を実行させるという基本的なコードなのですが、
下では「$come」、「$name」、「$title」が”全て未記入”であっても、
「コメントが入力されていません」と、一箇所だけしかエラーが吐き出されません。

全て未記入であった場合
------------------------------------------------------
コメントが入力されていません
名前が入力されていません
タイトルが入力されていません
------------------------------------------------------
等、全てのエラーを”一度に全部”吐き出したいのですが、やり方が分からず困っています・・・・。
どうかよろしくお願いします。

------------------------------------------------------
if ($come eq "") { &error("コメントが入力されていません"); }
if ($name eq "") { &error("名前が入力されていません"); }
if ($title eq "")  { &error("タイトルが入力されていません");}
------------------------------------------------------
sub error {
local($msg) = @_;
print "<br>\n";
print "<table border=\"1\" cellpadding=\"3\" width=\"500\" cellspacing=\"0\">\n";
print "<tr><td align=\"center\">\n";
print "$msg\n";
print "</td></tr>\n";
print "</table>\n";
exit;
}
0795nobodyさん2006/06/22(木) 01:04:29ID:???
>>794
error() の最後で exitしてるので、当たり前です。
0796nobodyさん2006/06/22(木) 01:07:27ID:???
一度実行されたら exit; されてるので1つしか表示されないです。

my $errormsg = "";
if(!$come){ $errormsg .= "コメントが入力されていません<br>\n"; }
if(!$name){ $errormsg .= 名前が入力されていません<br>\n"; }
if(!$title){ $errormsg .= タイトルが入力されていません<br>\n";}
if($errormsg){ &error($errormsg); }

こんな感じでしょか
0797nobodyさん2006/06/22(木) 01:09:10ID:???
ダブルクオーテーション抜けた
実行してるソースに書くときは忘れずに・・・
07987942006/06/22(木) 01:11:04ID:???
>>795-797
あぁ、もう夜遅くなのに、本当に感謝・・・orz
ありがとうございます。本当にありがとうございます。 orz
0799nobodyさん2006/06/22(木) 01:30:47ID:???
>>796
$come eq ""を!$comeに変えたのはあまり宜しくないと思うぞ
"0"が入ってきたらどうする
# 確かに無意味そうな投稿だから弾いても良いかも知れんが
08007852006/06/22(木) 01:42:48ID:???
>>792
ありがとうございます!
今回、CGI経由にする目的の一つに、テンプレート内の相対パス指定がCGI経由で
崩れるのを回避するため、ファイル指定関数でfile.cgiを呼び出す、というのが
あったのですが、それは別の方法で解決するとして、一般的な直リンク防止の仕組みは
おっしゃる方法でみんなやってそうですね。試してみます。

>>789
ごめん、全く憶測で言ってるので鵜呑みにしないでください。
0801nobodyさん2006/06/22(木) 10:08:11ID:???
質問です
1000を1,000に変換する関数とかってありますか?
0802nobodyさん2006/06/22(木) 10:14:14ID:???
Perlメモ
0803nobodyさん2006/06/22(木) 10:47:24ID:???
>>785
> 画像をCGI経由で呼び出すと格段に遅い

そう? 実際簡単に↓のようなソース作ってやってみたけど、

#!/usr/bin/perl
my @begin = times();
{
    my $img = $ENV{QUERY_STRING} || './hoge.png';
    $img =~ s/^\?//;
    my $ext = ($img =~ s/\.([A-Za-z]+)$//) ? lc $1 : 'png';
    open (IMG, $img .'.'. $ext) or die;
    my ($size, $modified) = (stat(IMG))[7, 9];
    read (IMG, $_, $size);
    close (IMG);
    binmode (STDOUT);
    print "Last-Modified: ", scalar (gmtime $modified), "\n";
    print "Content-length:", $size, "\n";
    print "Content-type: image/", ($ext eq 'jpg' ? 'jpeg' : $ext), "\n\n";
    print $_;
}
my @end = times();
open (FILE, '>times.txt');
print FILE 'user: ', ($end[0] - $begin[0]), ' , sys: ', ($end[1] - $begin[1]);
close (FILE);
exit;

結果 user: 0 , sys: 0.0078125 とかで、0.01秒かかるかかからないかくらいだったよ?
試したときの画像のサイズは 2.3Mb くらい。
もしかして1行ずつ読みこんでるとかじゃないよねw それとも何十個のファイルを一度に出すとか?
まあ、いちいち負荷かけるのはうちもどうかとは思うけど。
0804nobodyさん2006/06/22(木) 10:49:30ID:???
素朴な疑問。
ある値を空にするとき
$scalar = "";とするのと$scalar = '';とするのとは厳密に言えばどっちが正しいの?
あと、要素が空かどうかを調べるとき
if($scalar eq "")とif($scalar eq '')とか。
0805nobodyさん2006/06/22(木) 10:52:09ID:???
感覚的にはシングルにしたいw
0806nobodyさんNGNG
シングルクォートは美しくないし遅い
0807nobodyさん2006/06/22(木) 11:03:05ID:???
>>806
mjd? ソースとかある?
0808nobodyさんNGNG
ありゃ、eqの場合はシングルクォートの方が早かった
代入の場合はダブルの方が高速だったんだけどなぁ
スマソ ソースはム板だったような
0809nobodyさんNGNG
まぁどちらにせよ誤差の範囲なので
好みの問題なのでわ
0810nobodyさん2006/06/22(木) 11:15:30ID:???
そうなんや? どこで速度差がでてるんだろう・・・。
08118042006/06/22(木) 11:15:45ID:???
>>805-809
ども!まさかベンチまでしてもらってたとは恐れ入りまする。
すっきりしました。
0812nobodyさんNGNG
ベンチしてて分かったけど
比較対象or代入対象が長い文字列な程
ダブルクオートの方が速くなった
08138012006/06/22(木) 12:03:04ID:???
すみません
何気にスルーされてる801です。

1000を1,000のように変換することってできませんでしょうか?
0814nobodyさん2006/06/22(木) 12:04:36ID:???
いや、802が答えてるしw
08158012006/06/22(木) 12:18:36ID:???
$a = 1000;
$a = Perlメモ($a);
こんなかんじ?

Perlメモの意味がわかりません・・・
0816nobodyさんNGNG
テンプレぐらい読もうや
0817nobodyさん2006/06/22(木) 12:35:31ID:???
>>815
ちょっとだけ面白かったw
0818nobodyさん2006/06/22(木) 12:55:09ID:???
>>815
>>9
08197372006/06/22(木) 12:58:32ID:fNuZm9nk
昨日お世話になりました737です。返事とお礼が遅くなってすみません。

>>775-778
ありがとうございます。
お蔭で住所によるソートについてうまく動作するようになりました。
本当に助かりました。

>>780
「住所」の項を「都道府県」と「それ以下」に分けることも考えたのですが
さらに「市町村」でソートすることも今後ないとは言えないので
柔軟に対応できるようなコードがあれば、そっちの方が良いかなと思った次第でした。
08207372006/06/22(木) 13:04:30ID:fNuZm9nk
ところでソートについてはうまくいったんですが、
「フォームで選択された項目のみを出力する」という方法が
やはり>>737で書いたようなやり方しか考え付きません。
どうすればもっとスッキリとして処理になるでしょうか?

# 「$nenrei」「$seibetsu」「$denwa」はそれぞれ
# 「年齢」「性別」「電話番号」情報を出力するかどうかのフラグ。

open ( LOG, "< name.txt" ) || die ( "ERROR: $!" );
flock ( LOG,1 );
while ( <LOG> ) {
my @tmp = split (/<>/);
if ( !$denwa ) { splice ( @tmp , 3 , 1 ); }
if ( !$seibetsu ) { splice ( @tmp , 2 , 1 ); }
if ( !$nenrei ) { splice ( @tmp , 1 , 1 ); }
push ( @data , join (',' , @tmp ) );
}
close ( LOG );

# 以下、昨日教えていただいたコードで処理。

$i = 0;
undef(%jusho);
foreach $name ('北海', '東京', '愛知' , '大阪', '福岡') {
$jusho{$name} = $i++;
}
@data = map {$_->[0]}
sort {$jusho{$a->[1]} <=> $jusho{$b->[1]}}
map { my @tmp = split(/<>/); $tmp[4] =~ /^(.*?)(?:県|都|府|道)/; [ $_, $1] } @data;

# @dataを出力。
0821nobodyさん2006/06/22(木) 13:39:30ID:???
>>804
ダブルクォートだと変数展開しようとするから遅いんじゃないの??

>>815
ワロタww
「Perlメモ」でググってみ
0822nobodyさん2006/06/22(木) 13:41:23ID:???
全部書かせる気じゃないだろーねw
ってか >>820 のやりかただとデータの配列ぶっこわれて map 内の $tmp[4] が違うくなるよーな。
splice するより、$tmp[3] = ''; とか空白にすればいいんでないかい?
0823nobodyさん2006/06/22(木) 13:43:16ID:???
>819
その時は文字列を連結すりゃいいじゃん

データ構造を考えるのもプログラミングのうちですよ。
0824nobodyさん2006/06/22(木) 13:52:02ID:???
ソートとか検索考えると細かく分けたほうが後々対応しやすい
都道府県/市区町村/それ以下
の3つのカラムに分けておくね、俺なら。
既存のデータがあるの?
0825nobodyさん2006/06/22(木) 13:54:34ID:???
だな。実行速度も速いし。
0826nobodyさん2006/06/22(木) 14:01:39ID:1JauVdIN
@a=("a,1","b,2","c,1");
上記のように、カンマ区切りのCSVデータを文字列として配列に入れた状態で、

CSV内、2つめの値が1のものだけを@bの配列にいれるには、
foreachで全レコードを回し、条件式を使って@bにpushするしかないんでしょうか?

こういった状態にしたいんですが。
@b=("a,1","c,1");
0827nobodyさん2006/06/22(木) 14:05:22ID:???
まp
0828nobodyさん2006/06/22(木) 14:05:51ID:???
gれp か・・・
08297372006/06/22(木) 14:17:17ID:fNuZm9nk
>>822
あ!その通りですね・・・。
できるなら配列を短くした方が処理としては良いと思って削ってました。

>>823-824
なるほど。最初から細かい部品に分けておいて
必要に応じて連結して対応する形にする方が効率的ですね。
一応、既存のデータはありますがそれほど数は多くありませんし
テキストエディタでも使えばすぐに書き換えられそうなので
データファイルの構造を変えようと思います。

繰り返しになりますが「フォームで選択された項目のみを出力する」という方法については
whileで1回1回全て開いてから、選択されているかどうかをチェックする方法(>>820の前段)で良いんでしょうか?
もちろん動くことは動くんですが、選択の有無のチェックを各行ごとに行う処理を
1回のチェックでできないかと悩んでいます。
0830nobodyさん2006/06/22(木) 14:21:42ID:???
いつまでデバッグさせるの?
そろそろ自分でやりなよ
0831nobodyさん2006/06/22(木) 14:24:10ID:???
spliceしたら配列ずれませんかね・・・
0832nobodyさん2006/06/22(木) 14:26:23ID:???
わざわざ消すぐらいならView側で表示しないよう分岐させちゃう
のはダメ?
0833nobodyさん2006/06/22(木) 14:28:18ID:???
>>829
アイデア次第でできないこたないけど、たいして変わらないからいいんでねw
0834nobodyさん2006/06/22(木) 14:28:59ID:???
>>832
ああ、うちもそうする。
0835nobodyさん2006/06/22(木) 14:33:56ID:/RLzZFvL
sub password{
undef my $pass;
undef my @temp;

my $val = 7; #パスワード8文字
my @char = ('a'..'k','m','n','p'..'z','A'..'H','J'..'N','P'..'Z','2'..'9');

srand(time ^ $email);
foreach (0..$val) {
{
push(@temp,splice(@char,rand(@char),1)) while @char;
@char = @temp;
}
$pass = $char[($_)] . $pass;
}
return $pass;
}

として、パスワードを生成しているんですが、同一プロセスで二つ以上の異なったパスワードを生成したい場合
どうしたらいいんでしょうか?
$emailはグローバル変数でユニークです。$emailが違う毎に違うパスワードを生成したいんですが、
同じ値が返ってきます。

srandって呼び出しできるの一回だけなんですよね。
0836nobodyさん2006/06/22(木) 14:37:24ID:???
srand しなきゃいいんじゃね
0837nobodyさん2006/06/22(木) 14:43:03ID:???
5.004以降はsrand(time)が自動で呼ばれます
0838nobodyさん2006/06/22(木) 14:43:23ID:/RLzZFvL
>>836
おお。できました
ありがとです<(_ _)>
08397372006/06/22(木) 14:45:33ID:fNuZm9nk
>>830
デバッグ・・・そんなつもりはなかったんですけど、
結果的にそういうことになってましたか・・・。
すみません。
「配列の中から必要なものだけ」という点についても
何かアドバイスが欲しかったので、しつこく聞いてしまいました。
すみませんでした。

>>831
その通りでした。
>>822にて指摘していただいた通り
spliceするのではなく要素を空にする方法にします。

>>832>>834
>View側で表示しないよう分岐
にしても、結局同じように@data内を1行ずつ展開して
表示させるかどうかのチェックをする方法しか思いつきませんでした。
アドバイスありがとうございました。

>>833
もしかしたら、自分のやりたいことと書いてるコードが全然見当違いのことをやっていて
「そんな無駄な処理しなくても、こうやった方が良い」というのがあるのかな、と思って質問しました。
特段、妙なコードを書いているわけではないと分かっただけでもありがたいです。

同じような質問、くだらないことを何度もしつこく書き込みをしてすみませんでした。
今まで懇切丁寧に色々と教えて下さった方々本当にありがとうございました。
0840nobodyさん2006/06/22(木) 14:53:39ID:???
#先に設定
my @checked = qw(1 0 1);# 「年齢」「性別」「電話番号」を出すか

#ループ内で消す
my $i = 0;
foreach my $flg (@checked){
undef $tmp[$i] if $flg;
}

こうするとか。
まぁViewでやるけど。
0841nobodyさん2006/06/22(木) 15:24:19ID:???
>>839
じゃあ最後に土産

my %in = (denwa => 1, seibetsu => 0, nenrei => 0, juusyo => 1, hoge => 'hogehoge'); # クエリのデータ?
$in{namae} = 1;    # 名前は必ず必要
my @checks = qw(namae seibetu nenrei denwa juusyo);    # 含まれるデータの名前
# データ取得
my @data = qw();
open ( LOG, "< name.txt" ) || die ( "ERROR: $!" );
flock ( LOG,1 );
while ( <LOG> ) {
    my $d = {};
    @{$d}{ @checks } = split (/<>/);
    foreach my $key (@checks) {
        delete $d->{$key} if (!$in{$key});
    }
    push (@data, $d);
}
close ( LOG );
# ソート
my $i = 0;
my %jusho = ();
foreach my $name ('北海', '東京', '愛知' , '大阪', '京', '福岡') {
    $jusho{$name} = $i++;
}
@data = map {$_->[0]}
            sort {$jusho{$a->[1]} <=> $jusho{$b->[1]}}
                map { $_->{juusyo} =~ /^(.*?)(?:県|都|府|道)/; [$_, $1] } @data;
# print
foreach my $d (@data) { while (my ($k, $v) = each %$d) { print $k, ': ', $v, ', '; } print "\n"; }
0842nobodyさん2006/06/22(木) 15:27:23ID:???
甘やかすなw
0843nobodyさん2006/06/22(木) 15:30:29ID:???
もう来ないらしいからいいかと思ってww
0844nobodyさん2006/06/22(木) 17:30:21ID:???
$hoge{"aaa1"} を参照する際、
$i = 1;
print $hoge{aaa$i}; だとエラーになるのですが、正しい記述方法は何でしょうか?
0845nobodyさん2006/06/22(木) 17:36:13ID:???
なんでわざわざダブルクオーテーション外したのかkwsk
0846nobodyさん2006/06/22(木) 17:38:57ID:???
こういうのって bare word で書くから出て来ちゃった弊害だよね
0847nobodyさん2006/06/22(木) 17:50:11ID:fJKTYP9w
関数で帰ってきた文字列を、そのままprintの中に埋め込みたい時は
どうすれば良いのでしょうか?現在は↓のように書いています。
  print "ほげ".&hoge('abcd')."ほげ";
しかし、なんか綺麗じゃないので、↓のような感じで書く方法とか
あったら、良いなぁと思ってます。
  print "ほげ&hoge('abcd')ほげ";
↓のような書き方も良いのですが…。
  print sprintf("ほげ%sほげ",&hoge('abcd'));
まだPerlを始めたばかりなので、皆さんの知恵をかしてください。
0848nobodyさん2006/06/22(木) 17:52:45ID:???
>>847
print
    "ほげほげほげ",
    hoge('abcd'),
    "はげはげはげ";

とか?
0849nobodyさん2006/06/22(木) 17:54:49ID:???
print
"ほげ",
&hoge('abcd'),
"ほげ"
;
#改行しちゃえば?
0850nobodyさん2006/06/22(木) 17:57:17ID:???
>>847
printの中に埋め込まない方が良い

個人的には、
print "ほげ", &hoge('abcd'), "ほげ"; # 連結コスト無し

print "ほげ" . &hoge('abcd') . "ほげ"; # だと2回分、文字列連結コストがかかる
print "ほげ&hoge('abcd')ほげ"; # 動作せず
printf("ほげ%sほげ", &hoge('abcd')); # printf, sprintf のコストは重い
0851nobodyさん2006/06/22(木) 18:02:27ID:???
配列リファレンスをデリファレンス、だけど、、、。
見栄えはあまりねぇ。

逐次出力したくないときは、どっちにしろ文字列連結コストがかかるし。
0852nobodyさん2006/06/22(木) 18:03:49ID:???
>>844
print $hoge{ 'aaa' . $i };
08538472006/06/22(木) 18:05:43ID:???
なるほど。" ."で連結するのと" ,"で繋げる事に
対するコストなんて考えてませんでした。

皆さんの意見が" ,"で繋げる事で一致しているみたいなので、
これからは、" ,"で繋げる方法でいこうと思います。
0854nobodyさん2006/06/22(木) 18:10:46ID:???
そこで、@{[]}
0855nobodyさん2006/06/22(木) 19:14:15ID:???
そこでPerl6ですよ
0856nobodyさん2006/06/23(金) 00:51:44ID:???
Script Error
The script did not produce proper HTTP headers.
Please see the error log to see the detail of the errors.
Depending on the server configuration, you can also run thisscript under CGIWrap debugging.
Usually, either rename or linkthe script temporarily to a file which ends with.
cgidextension, or add a AddHandler cgi-script-debug .cgiline to your .htaccess file.
─────────────────────────────────────
Perlで組んだCGIを実行するとこの様なエラーが出てしまい、困っています
CGIのログファイルに、既にデータが入っていれば、↑のエラーは出ないのですが、
ログファイルの中身が空っぽの場合↑のエラーが出ます。

なぜでしょうか?ログファイルを処理するコードに問題があるのでしょうか・・・・・・?
08578562006/06/23(金) 00:52:17ID:???
ちなみに問題があると思しきソースはこんな感じです
─────────────────────────────────────
sub data {

open(LOG,"< $logname") || &error("ログファイルが開けませんでした");

@logs=<LOG>;

close(LOG);

foreach $line(@logs) {
chop($line);
($atai1,$atai2,$atai3,$atai4,$atai5,$time,$value,$name,$titles,) = split(/\,/,$line);
if (!$line){last;}

print "<TABLE border=\"1\" align=\"center\" width=\"500\">\n";
print "<TR><TD>名前</TD><TD>$name</TD></TR>\n";
print "<TR><TD>タイトル</TD><TD>$titles</TD></TR>\n";
print "<TR><TD>投票</TD><TD>$atai1/$atai2/$atai3/$atai4/$atai5/</TD></TR>\n";
print "<TR><TD>書き込んだ時間</TD><TD>$time</TD></TR>\n";
print "<TR><TD>本文</TD><TD>$value</TD></TR>\n";
print "</TABLE><br>\n\n";

}

}
0858nobodyさん2006/06/23(金) 01:09:56ID:???
>>856
見慣れないエラーだな…XREAの鯖か?
それを見る限り、ログファイルが空というだけじゃ特に問題を起こしそうなコードじゃない。
が、それが出るのってもしかしてログファイルが存在しない場合、じゃない?
そうだとしたらerrorサブルーチンのほうをチェック。
特にHTTPヘッダをちゃんと出しているかどうかを確認汁。

どうでも良いが変数名はもうちょっと考えたほうが良いぞ…
valueって日本語で値なんだが…本文は大抵bodyとかtextとかかと。あとなぜにtitleが複数形なのよ。
0859nobodyさん2006/06/23(金) 01:42:46ID:???
ttp://sb.xrea.com/showthread.php?s=&postid=23784
08608562006/06/23(金) 01:57:18ID:???
今ちょっと調べてみたところ、無限ループがありました。
それがどうも、>>858さんがおっしゃっられた通り「&error;」に問題があるっぽいです・・・・。
ためしに、>>857(&data;)のログファイルの変数を適当な文字列に変え、実行したところ、
「ログファイルが開けませんでした」が無限と出てきました。

しかし、↓はその「error」のサブルーチンですが、取り分け私の目には可笑しいようには見えないのですが・・・・
─────────────────────────────────────
sub error {
local($msg) = @_;
print "<br>\n";
print "<table border=\"0\" cellpadding=\"3\" width=\"500\" cellspacing=\"0\" align=\"center\">\n";
print "<tr><td width=\"100%\" bgcolor=\"#C0C0C0\" align=\"center\">\n";
print "$msg\n";
print "</td></tr>\n";
print "</table>\n";
&data;
&foot;
exit;
}
─────────────────────────────────────
sub foot {
print "</BODY>\n";
print "</HTML>\n";
exit;
}
─────────────────────────────────────
0861nobodyさん2006/06/23(金) 02:32:49ID:???
sub errorの中で&dataを呼んでるので、またエラーが出る、さらにエラーが出る、→無限ルーーーーーーーーーープ!
0862nobodyさん2006/06/23(金) 07:34:25ID:???
なんでエラー表示するときにデータ読もうと思ったのかkwsk
■ このスレッドは過去ログ倉庫に格納されています