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

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

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

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

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

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

過去ログやお勧めサイトは >>2-10
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って凄いな。ある意味。

0728nobodyさん2006/06/20(火) 22:36:16ID:???
>>726
フォームから受け取ってるんだからそれは出来んでしょ
0729nobodyさん2006/06/20(火) 22:37:42ID:???
>>725
ここを直しても動かないけど、明らかにおかしいところ。

そのいち:
open( FILE, ">>./dat/img_data.dat"); は、追記オープンでしょ。

そのに:
print; は標準出力でしょ。少なくとも print FILE $_; にしないとFILEの意味がない!

と書いてたら>>727に先を越された。

>>728
意味が分からない。
0730nobodyさん2006/06/20(火) 22:39:45ID:???
>>724
なんで amazon? テーブルレイアウトバリバリじゃね?
0731nobodyさん2006/06/20(火) 22:51:15ID:???
レイアウトはリキッドデザインのCSSだよ。
0732nobodyさん2006/06/20(火) 22:54:19ID:???
ゴメ、思いっきり記憶違いだったw
0733nobodyさん2006/06/20(火) 22:56:30ID:???
CSSとかスレ違いどころか板違いなんだから、あまりひっぱりすぎちゃダメだぞ☆

とW3C信者の俺が言ってみる
0734nobodyさん2006/06/20(火) 22:58:09ID:???
商品紹介のとこはリキッドデザインでCSSでfloat指定してるな。
この部分のことかね?
0735nobodyさん2006/06/20(火) 23:21:15ID:???
>>725
File::Inplace 使っとけ。
0736nobodyさん2006/06/21(水) 01:11:43ID:???
話がずれてるので、そろそろ終わりにしようや
0737nobodyさん2006/06/21(水) 12:25:23ID:Jpc8QU0a
・name.txtの中には「名前<>年齢<>性別<>電話番号<>住所」
 という情報が入っている。
・これを「住所」でソートして結果を出力(都道府県別という程度のソート)。
・その際、ブラウザにはフォームで選択した項目の情報だけを吐き出す。

ということをやりたいんですが、

1.openしてwhileで1行ずつ配列(@temp)に入れて処理。
 1-1.フォームで選択されていないものを@tempからspliceして除去。
 1-2.全ての都道府県にあらかじめ番号を付けておき、
   $temp[4]に当たる値とマッチングさせて、unshiftで@tempの頭にその番号を付ける。
 1-3.@newdataに@tempをpushで追加していく。
2.@newdataをソートして出力。

という方法しか思いつきませんでした。
でも、これだと不要な項目をループ処理の中で1回1回チェックしていて
ものすごく無駄なことをしている感じがします。
ファイルを開く前に必要な項目をチェックしておいて、
ファイルを開くときにはそれだけを取り出して処理する、
ということはできないでしょうか?
0738nobodyさん2006/06/21(水) 12:42:09ID:???
「自分で決めた順番でソートする」でググってそこをブックマークしとけ
あと>>681とそれに対するレス見て
07397372006/06/21(水) 12:56:08ID:Jpc8QU0a
>>738
ありがとうございます。
それにしても「自分で決めた順番でソートする」という
ピンポイントな文章で結果が出るとは・・・。
しっかりブックマークして読んできます。
0740nobodyさん2006/06/21(水) 13:10:47ID:QAUqj+Eu
1: 自分はこういう事がしたい。
cvs?といいますか、特定の文字で区切られた(12個)ファイルを読み込んで
二次元配列に入れて、処理をしたい。
2: それでこんな風にやってみたが・・・
for文(i++)で行を読み込んでから、それをさらにfor文(j++)で区切りずつに
わけ、その都度$list[$i][$j]に入れていくようにしました。
3: こんなエラーが出て上手く行かなかった。
12行目に来たところで突然ちゃんと配列に入らなくなってしまいました・・・。
読み込むファイルに原因があるのかと思い、1行から20行まで同じ内容のファイルを作ったのですが
同じように読み込めませんでした・・・。どのようなことが原因と考えられるでしょうか・・・?
0741nobodyさん2006/06/21(水) 13:21:16ID:???
>>739
Perlメモには多くの人がお世話になっているはず。
そのページの他の項目も非常に為になりますよ。

>>740
どんなエラーですか・・・
0742nobodyさん2006/06/21(水) 13:45:57ID:???
>>740
どっかでindex付け間違いと予想。
というか説明わかりにくすぎなので、ソース晒してください。
07437372006/06/21(水) 13:46:58ID:Jpc8QU0a
>>741
これはとても勉強になりそうです。
逆引きなのが助かります。

ところで、>>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:???
>>740
別に20行目とか多次元配列で何か起こるってことはないと思う。
どうみても処理のせいです。
同じように多次元配列(ハッシュ) にいれるモジュール作ったけど、そんなことは起きなかったし。
データが shiftjis で、その特定のマーカーと知らないうちにかぶってるとか。
0746nobodyさん2006/06/21(水) 13:51:14ID:???
>>744
だからさ、そのような挙動をする最低限のソースを載せようよ。
みんなそんなエスパーできないって。
0747nobodyさん2006/06/21(水) 14:00:01ID:???
>>743
応用しようぜ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:???
直そう思ってたのに忘れてたw

sort {$jusho{$a->[1]} <=> $jusho{$b->[1]}}

sort {$jusho{$a->[1]} cmp $jusho{$b->[1]}}
07497372006/06/21(水) 14:20:59ID:Jpc8QU0a
>>747-748
>sort {$jusho{$a->[1]} cmp $jusho{$b->[1]}}
これは「名前」でソートするってことですか?

>$tmp[5] =~ /^(.*?)(?:県|都|府|道)/; [ $_, $1]
この部分が分かりません・・・。
簡単にで良いので解説を・・・。
0750nobodyさん2006/06/21(水) 14:35:16ID:???
ただの正規表現ですがな。
()の中身を取って$1に入れときたいのです。
0751nobodyさん2006/06/21(水) 14:35:26ID:???
>>747
とりあえず「京都府」のときに困りそうなコードだと指摘しておこうw
0752nobodyさん2006/06/21(水) 14:44:47ID:???
京都は意地汚い奴が多いから捨ててもいい。
07537372006/06/21(水) 14:54:48ID:Jpc8QU0a
>>750
解説ありがとうございます。

とすると、
>>747の処理をして一旦「都道府県」だけを取り出して>>743の処理をする
という解釈で良いんでしょうか?
それとも>>743のコードの6行目以下を>>747のニュアンスのように書き換える
ということなんでしょうか?

京都府に関しては岸部四郎に免じてお許しを。
0754nobodyさん2006/06/21(水) 15:02:29ID:???
東京は困らないんですか?
0755nobodyさん2006/06/21(水) 15:11:00ID:???
困らないよ。
07567372006/06/21(水) 15:19:55ID:Jpc8QU0a
>>753については後者ですね・・・くだらないことを聞いてすみません。
0757nobodyさん2006/06/21(水) 15:26:09ID:???
もしSJISだったらいくらなんでもエスケープくらいしてねw
0758nobodyさん2006/06/21(水) 15:27:40ID:???
流れはutf8なんでしょ?
0759nobodyさん2006/06/21(水) 15:33:54ID:???
utf8 は便利だよね。
0760nobodyさん2006/06/21(水) 15:40:10ID:???
既存コードがeuc-jpで、HTMLとして送り出すときはiso-2022-jpにしてあるからなぁ。。。
0761nobodyさん2006/06/21(水) 15:42:59ID:???
なんでわざわざjis w
0762nobodyさん2006/06/21(水) 15:47:58ID:???
昔は(ってもう10年以上前か)、ネット上を流すにはJIS、つまり7bitで、という話があったのよ。
HTTP上の問題は今になって考えればなかっただろうが。
UAでの解釈問題はあるかもな。

今の出力コードでおすすめは何?
c-HTMLではSJIS onlyなi-modeも拡張されたの?
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:???
だな。実行速度も速いし。
■ このスレッドは過去ログ倉庫に格納されています