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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2006/06/26(月) 00:46:38ID:???
Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
0285nobodyさん2006/07/06(木) 16:54:28ID:???
質問です。
OSはWINです。

すごい初心者で変な質問ですみません。
perlで、dosコマンドを実行することって
できるんでしょうか。

たとえば、
print "del a.txt";
というようにファイルを消そうと標準出力しても
実行できませんでした。

可能でしたら、方法ご教授お願いします。
02862812006/07/06(木) 16:56:24ID:gzQtm5v/
>>282
それです!ありがとうございます。

>>283>>284
print <<HTML;
hoge$i_code
HTML
だとどうなんですかね。
汎用性に問題あり?
教えてクレクレ君の分際で偉そうにすみません。
ありがとうございました。
02872572006/07/06(木) 16:57:41ID:???
>>258-260
なんとなく好意的な感想どもです〜^-^/
0288nobodyさん2006/07/06(木) 17:11:28ID:???
>>285
実行するだけならsystem関数、その出力が欲しいならバッククォートまたは、パイプでopen。
だが、そのファイルを消すというのが単なる例じゃないとしたらunlink関数を使うべき

>>286
284はこういう場合に問題ありだな
"${i}nhoge"
0289nobodyさん2006/07/06(木) 17:24:25ID:???
>>288
はやいお返事ありがとうございます。
さっそく勉強します。
0290nobodyさん2006/07/06(木) 17:40:34ID:???
>>288
じゃあ "$i\x6ehoge"

とかいいつつ、俺もいつも ${i} 以外は書かないw
0291nobodyさん2006/07/07(金) 08:16:27ID:???
>>290
いつもって、そんなに使うことありますか。それ使うときって
変数を変数名にする場合ってことであってますか?
0292nobodyさん2006/07/07(金) 08:22:27ID:???
>>291
大人にはいろいろあるのよ。
0293nobodyさん2006/07/07(金) 08:25:50ID:???
>>292
ム板のアリスさんでしょ?僕を大人にしてください。おながいします。
0294nobodyさん2006/07/07(金) 12:05:06ID:???
すいません。本当に初歩的な質問かと思いますが、
Perl5.8で、jcode.plやJcode.pmを使わずに
全角英数と半角英数の変換を行う方法があれば、教えてください。
0295nobodyさん2006/07/07(金) 12:32:03ID:???
ttp://www.kanzaki.com/docs/jcode.html
step1. 文字コードについて理解する
step2. がんばる
02962942006/07/07(金) 14:25:27ID:???
色々Web検索しながら試してみたところ、
下記のようなスクリプトをUTF-8で保存し、
入力テキストファイルもUTF-8で記述したところ、うまく動作しました。
$_ = decode('utf8',$_);
の部分の意味がよくわからないので教えてください。
ここは何をしてるんでしょうか?

use strict;
use utf8;
use Encode qw/ encode decode /;

while (<>){
$_ = decode('utf8',$_);
tr/[0-9]/[0-9]/;
print;
}
0297nobodyさん2006/07/07(金) 15:11:08ID:???
tr/[0-9]/[0-9]/

オアエスゴイナww
0298nobodyさん2006/07/07(金) 15:19:10ID:gJw2prbr
配列の中身全部を全角→半角みたいに変換するには
やっぱforeachとかで中身を展開しながら1コずつ処理するしかない?
jcode.plとかJcode.pmとで配列そのものを扱う方法ってある?

>>294
英数字限定なら正規表現でどぞ。
0299nobodyさん2006/07/07(金) 15:40:01ID:???
それくらい面倒くさがるなよ(´・ω・`)
03002982006/07/07(金) 16:19:58ID:???
>>299
CGI.pmでフォームの内容を配列に入れて文字コードごにょごにょってのは
結構色んなとこで使われそうな処理なんで、実装されてたりするのかなぁ、と思ったもんで。
無いと分かれば、安心して配列回しまくれますわ。さんくす。
03012942006/07/07(金) 16:27:23ID:???
>>297
[]は要らないよ、とおっしゃっているのでしょうか?

>>298
正規表現というと、具体的には?s///を使ってできるという意味ですか?
0302nobodyさん2006/07/07(金) 17:13:35ID:???
>>296
1byte 単位(正確には 8bite 単位)の処理から utf8 の文字列処理に
変換している。
$_ = decode('euc-jp', $_ ) ;
なら、8bite 単位の羅列を euc-jp でエンコードされてると見做
した上で、utf8 に変換。
03032942006/07/07(金) 17:26:00ID:???
>>302
レスありがとうございます。
バイト単位から文字単位へ、という事が必要なので
読み込ませるテキストがUTF8でも必要、という事でしょうか。

読み込ませるテキストの文字コードがわかってない時はややこしそうですね。
0304nobodyさん2006/07/07(金) 17:40:55ID:???
>>303
その通りだと思います。が、perl hacker ではないのでw
03052052006/07/07(金) 20:47:14ID:???
自己解決しました。2重に書き込みされてたのは書き込み部分
open(F,">$localsubjectpath")||die"subject.txtをopen出来ません:$!";
foreach(@localsubject){print F $_;}
close(F);
が追記モードになっていたために2重に書き込んでしまうという症状が起きました。
上書きモードで実行したらうまくいきました。
くだらない質問に答えてくれて本当にありがとうございました。
0306nobodyさん2006/07/07(金) 21:37:02ID:???
>>305
解決おめ。
234で指摘したのとほぼ同じ原因でないか…自力で二日も模索乙
まさか、まだ追記モードを使っていたとは夢にも思ってなかった訳だが。
0307nobodyさん2006/07/07(金) 22:07:16ID:???
>>305
おめ。
俺はがんばって >>234 のコードを読解して新しく書き直してるのかと思ってたw
少しは参考にすればいいのにね。
03082942006/07/08(土) 10:38:42ID:???
すいません。こちらではこれ以上回答がいただけないようなので、
こちらでの質問はこれで終わりとし、
別スレでこちらで回答していただいた事を元に
少しポイントをしぼって質問してみたいと思います。
回答していただいた方々、ありがとうございました。
03092942006/07/08(土) 10:40:49ID:???
あ、ひょっとしたら他所で質問しないかもしれないです。では。
0310nobodyさん2006/07/08(土) 13:48:22ID:???
他所で質問しても無駄だと思うけどwwwww
0311nobodyさん2006/07/08(土) 14:50:57ID:9n4HcMAb
Encodeを使ってメール送信用にUTF8からJISに変換したいのですが、
「〜」の変換がうまくいきません。
変換できずに、「\x{ff5e}」になってしまいます。
JISにも「〜」ありますよね。

どうしたら回避できるでしょうか?
0312nobodyさん2006/07/08(土) 14:58:49ID:???
文字コードも書いてないしなー。
どの文字コでも設定と正規表現で2行だと思うけどw
0313nobodyさん2006/07/08(土) 15:03:12ID:???
>>311
それうちもなった気がする。
「〜」 だけ自分で直せばいいんじゃないかな
0314nobodyさん2006/07/08(土) 15:15:04ID:???
>>311
Unicodeと既存のエンコーディングのマッピングを作る際に、〜のマッピングがメーカーによって
WAVE DASHとFULLWIDTH TILDEの二つに分かれてしまったことに起因する問題。
http://ja.wikipedia.org/wiki/Unicode

事前に"\xEF\xBD\x9E"(\x{FF5E})を"\xE3\x80\x9C"(\x{301C})に変換して統一してやればOK。
ちなみにUTF-8はASCIIとの兼ね合いは勿論のこと、1バイト目の範囲が2バイト目以降の範囲と
重ならないように設計されているから、utf-8フラグを使用しない場合でも、ずれてマッチする心配はしなくて大丈夫。
0315nobodyさん2006/07/08(土) 15:17:56ID:???
>>314
うわぁ、知らなかったナリィ・・・
0316nobodyさん2006/07/08(土) 15:28:25ID:???
>>311
とってもまだるっこしいですが、

encode('iso-2022-jp', decode('shiftjis', encode('cp932', $x)))

とする手もあります。

日本は既存の文字コードとunicodeの対応表をつくるにあたって
統一に失敗して大きく2種類(JISとMS)できてしまったため、こんな
面倒を強いられるのです。恨むなら当時の関係者を恨んでください。

ちなみに「〜」を\x{ff5e}にするのはMS流で、JISだと\x{301c}に対応
させることになっています。

個人的には日本語に関してはunicodeはunicode-jisをunicode-msの
2種類あると思って、それらを自動判定して相互変換するJcode相当の
モジュールが欲しいなと思います。
0317nobodyさん2006/07/08(土) 15:31:47ID:???
みんなEncode使ってるみたいだけど、
そういう面倒を吸収してくれるライブラリがやっぱり必要なんじゃない?
0318nobodyさん2006/07/08(土) 15:39:20ID:???
変換 → 自作モジュ → Encode (5.8の場合)
                  → Jcode (それ以下)

とかやって、その自作モジュのとこで対策すればいいのかもだね
0319nobodyさん2006/07/08(土) 15:40:35ID:???
>>314 リンク先のリンク先 の dan さんのとこで
ttp://search.cpan.org/dist/Encode-EUCJPMS/EUCJPMS.pm
使え的な指摘がありますよ。
0320nobodyさん2006/07/08(土) 15:41:10ID:???
「の」がぬけた orz...
03213112006/07/08(土) 15:41:57ID:9n4HcMAb
みなさんありがとうございます。
〜は事前に\x{301c}に変換したいと思います。

実際、携帯電話からの入力なので、
Encode::from_to( $x, "CP932","UTF8");
としてUTF8に変換してたのですが、CP932→UTF8なので「〜」が\x{ff5e}になってしまうんでしょうか?
0322nobodyさん2006/07/08(土) 15:55:45ID:???
その方向だと、円マーク(\)やオーバーライン(~)は大丈夫なん?
0323nobodyさん2006/07/08(土) 16:11:50ID:???
スカラ変数は白い布で覆った方がいいのでしょうか?
0324nobodyさん2006/07/08(土) 17:22:37ID:H4L43ePp
push @fuga, $hoge_A[$_] . $hoge_B[$_] foreach 0..3;

これを省略せずに書くとどうなりますか?

配列の1番目から4番目まで限定的ではなく
配列内全てをforeachする書き方が分かりません。
@hoge_Aと@hoge_Bの要素数は同じです。
0325nobodyさん2006/07/08(土) 17:40:04ID:???
>>324
> push @fuga, $hoge_A[$_] . $hoge_B[$_] foreach 0..3;
> これを省略せずに書くとどうなりますか?
foreach my $i (0,1,2,3) {
  push @fuga, $hoge_A[$i] . $hoge_B[$i];
}
0326nobodyさん2006/07/08(土) 17:41:41ID:???
>>324
省略せず、じゃなくて一般化の話かな。
まず要素数を取得し、そこから範囲を作る。そのRangeに対してforeachもしくはmap
push @fuga, $hoge_A[$_] . $hoge_B[$_] foreach 0..@hoge_A-1;
or
@fuga = map { "$hoge_A[$_]$hoge_B[$_]" } map 0..@hoge_A-1;

しかし、要素数は同じと言い切れるんだったら、同時に管理されるデータなんだろ?
なら関連性のある二つのデータを別の配列に入れると言う、その構造を何とかしたほうが良いと思う。
@fuga = map { "$_->{A}$_->{B}" } @hoge;
そうすると、こんな風にできる。詳しくはperllolを参照
0327nobodyさん2006/07/08(土) 17:44:23ID:???
>>326
@hoge_A-1 を $#hoge_A
と書くのがBest Practice。
$#は配列の最後の要素番号を表すから、
配列のインデックスとして使う場合に適している。
03283262006/07/08(土) 17:47:57ID:???
>>327
あースマソ…存在をすっかり失念していた…
あとでここ数ヶ月のスクリプトを確認せにゃ
03293262006/07/08(土) 18:01:09ID:H4L43ePp
>>325
「配列の1番目から4番目まで回す」んじゃなくて
「(0,1,2,3)という配列を回す」ってことだったんですね。
ありがとうございます。

>>326
大変詳しい回答と説明ありがとうございます。
想定通りの結果を得ることができました。
>関連性のある二つのデータを別の配列に入れると言う、その構造を何とかしたほうが良いと思う。
まさにその通りで、そのために今回の処理をしようとしていました。
具体的には(情報の後出しになってしまいますが...)
フォームから「月」と「日」を取得し、「日付」という配列に格納するための処理です。
とにもかくにも、アドバイスまでいただいて本当にありがとうございました。

>>327
より良いコードのためのアドバイスありがとうございます。
勉強になりました。
0330nobodyさん2006/07/08(土) 18:04:13ID:???
珍しく気持ちのいい質問者だw
0331nobodyさん2006/07/08(土) 18:51:46ID:???
perl 5.005 で print "\x{ff5e}"; とかってエラーするんだっけ? 単に文字化けするんだっけ?
環境なくなっちゃって確認できなくて orz
0332nobodyさん2006/07/08(土) 19:08:45ID:???
エラーにはならない
0333nobodyさん2006/07/08(土) 19:13:39ID:???
>>332
ならおk! ありんこー。
0334nobodyさん2006/07/08(土) 20:17:42ID:???
$cnt = @hoge_A ;
1 while $cnt != push @fuga, ( shift @hoge_A ) . ( shift @hoge_B ) ;
つーのを思いついた自分に鬱
0335nobodyさん2006/07/08(土) 21:09:20ID:???
すいません、クエリについて質問があるのですか・・・。

ある掲示板スクリプト(bbs.cgi)があるとします。
自分のWEBサイトではこの掲示板をいくつか設置しているのですが、
そのたびに、「bbs1.cgi」、「bbs2.cgi」、「bbs3.cgi」みたく名前を付けて設置しています。

これをクエリを使用して「bbs.cgi?c=1」や「bbs.cgi?c=2」みたくしたいのですが、考え方が分かりません。
ちなみにできればWEB上から必要な数を必要なだけ作成できるようにしたいと思っています。


アルゴリズムだけで構いませんので、どうかよろしくお願い致します。
0336nobodyさん2006/07/08(土) 21:17:18ID:???
エスパーさん、おながいしまつ
0337nobodyさん2006/07/08(土) 21:59:16ID:???
これは普通に読めるけど?

>>335
そのスクリプトの構造にもよるけど十中八九大改修。
他の掲示板と共有できない点を洗い出すことから始めるといいよ。ログファイルとか。
ファイル名変えてる=同一ディレクトリって所から危なっかしいけどPerl関係ない…
改造スレあたり行くのが無難だと思う。
0338nobodyさん2006/07/08(土) 22:33:57ID:???
CGI上で
print $x;
としようと思うのですが、$xはリファレンスの可能性があります。
リファレンスの場合であってもref関数でチェックなどせずにそのまま表示しようと思うのですが、リファレンスだとメモリの場所がわかるわけですよね。
これが何かセキュリティ上問題になるようなことはあるのでしょうか。
例えば、他の変数の内容を閲覧できてしまう、といったことがあれば考え直そうと思うのですが。
0339nobodyさん2006/07/08(土) 22:38:32ID:???
この程度のこともどうやるか見当もつかないプログラミングスキルでは
無理なのでもうすこし地道に勉強してからの方がいいと思われる。
0340nobodyさん2006/07/08(土) 22:39:14ID:???
あ、すまん。339は335へのレスね。
0341nobodyさん2006/07/08(土) 22:42:45ID:???
>>338
そんなことで悩んでる暇があったら表示されないようにちゃっちゃと
書き直すほうが早い。

メモリの場所がわかっただけで即やられるということはないだろうが、
他のセキュリティホールとの合わせ技でなんかされる可能性を
否定するのは難しい。

0342nobodyさん2006/07/09(日) 05:26:05ID:???
>>338
> これが何かセキュリティ上問題になるようなことはあるのでしょうか。

直接の問題はないと思う。
が、何を「セキュリティ上問題」とするかによるだろうね。
「メモリの場所がわかる」ことも見方によれば問題だろうし。
0343nobodyさん2006/07/09(日) 05:32:57ID:???
>>335
ログ読み込みで
open fh,"log$ENV{QUERY_STRING}.dat";
ログ書き込みで
open fh,">log$ENV{QUERY_STRING}.dat";

・・・不特定多数が来る板だとキケンかもw
0344nobodyさん2006/07/09(日) 05:40:13ID:???
>>338
$xはリファレンスでなかったら何になる可能性があるの?
リファレンスになるかもしれない$xを表示したいwebコンテンツ
って言うのが謎なんだけど・・・w
03453382006/07/09(日) 07:29:33ID:???
>>341-342
ありがとうございます。

>>344
確かにそうですね、、よく考えるとそう思います。
ちょっとアルゴリズムを再考してみます、ありがとうございました。
0346nobodyさん2006/07/09(日) 13:14:05ID:OFKeC9Kg
配列の要素に「その時点で何度目の重複か」という数字を付けたいんですが
そういうことはできますか?
簡単な例で言うと、
@DATA = ('B','A','A','B','A','D','C','D');
という配列を対象とした場合は、
@DATA = ('B0','A0','A1','B1','A2','D0','C0','D1');
といった感じです。

map{$count{$_}++}@DATA;
という風にしていくつ重複があったかを調べることはできたんですが
その都度、数字を振る方法が分かりません。
分かる方、どうぞよろしくお願いします。
0347nobodyさん2006/07/09(日) 13:21:34ID:???
grep { $_ = sprintf("$_%d", $count{$_}++) } @DATA;
0348nobodyさん2006/07/09(日) 13:24:03ID:???
@data = map { $_ . $count{$_} ++ } @data ;
>>347
何故に grep ?
0349nobodyさん2006/07/09(日) 13:36:33ID:???
346です。

>>347さん
>>348さん
即回答ありがとうございます!
どちらの方法でもうまくいきました。
348さんの記述の方がより簡潔なのでそちらの方を使わせてもらおうと思いますが
347さんの記述も参考にして勉強します(恥ずかしながら記述の内容が理解できてないので)。
ありがとうございました!
0350nobodyさん2006/07/09(日) 15:12:46ID:???
>>348
それだと 0 が付かないと思ったら、ちゃんと付くんだね。
++ で空の値が 0になる方が. の連結より評価が先になるってことか。

grep 使うのは @data に書き戻さないで良いから(@dataを直接書きかえる)。
>>348 のを grep で書くと
grep { $_ = $_ . $count{$_}++ } @data;
0351nobodyさん2006/07/09(日) 15:29:54ID:???
>>350
>grep 使うのは @data に書き戻さないで良いから(@dataを直接書きかえる)。
いや、map でも無精しなければ…。s/grep/map/ してみ?
0352nobodyさん2006/07/09(日) 15:42:53ID:???
$_ = $_ . $count{$_}++ for @data;

でよくね?

# TMTOWTDI
03533512006/07/09(日) 15:45:39ID:???
>>352
># TMTOWTDI
そだね。
0354nobodyさん2006/07/09(日) 16:19:00ID:???
こういうのを見てしまうとPerlに戻りたくなるなぁ
制御構文の後置って書いていて気持ちいいんだよな
0355nobodyさん2006/07/09(日) 16:29:17ID:Grc/Miyg
質問です。

以下のようなハッシュと配列があります。

my %sex = (
'm' => '男性',
'f' => '女性',
);

my @list = ('name','age','sex','mail','addr', ・・・);


プログラム中で、
while (my($key,$val) = each(%sex)){
 ・・・
}

という処理を行いたいのですが、%sexの'sex'という文字列を、@listから拾いたいのです。

while (my($key,$val) = each(%{$list[2]})){
 ・・・
}

というふうに。
もちろん上記の例では「ハッシュではありません・・・」という意味のエラーが出るのですが、
やりかたがわからず困っています。

each(eval ('%' . "$list[2]")

でもやっぱりダメで、他に考え付きません・・・
よろしくお願い致します。
0356nobodyさん2006/07/09(日) 16:39:01ID:???
my @list = (\%name,\%age,\%sex, ・・・); これじゃあかんのかいな?

ってか普通は %sex とかを $hash->{sex} = {}; とかってやる気がする。

ちなみに eval でやるなら
each(eval ('%' . "$list[2]") → each(eval ("\\%$list[2]") こうじゃね。
0357nobodyさん2006/07/09(日) 16:46:51ID:???
\ 多いて orz
0358nobodyさん2006/07/09(日) 16:46:54ID:???
eval "each %$list[2]"
03593552006/07/09(日) 19:33:47ID:???
>>356
配列@listには、"配列やハッシュに使う「名前」"だけを格納してるのです。。

>>358
evalの使い方を間違えていたのですね。
ありがとう。その例でできました。
0360nobodyさん2006/07/09(日) 20:03:39ID:???
>>359
>配列@listには、"配列やハッシュに使う「名前」"だけを格納してるのです。。
どういう経緯でそうなったかは知らないけど、
eval使いまくりで効率悪くなる事この上ないなぁ。

my %var = (
 'sex' => {
  'm' => '男性',
  'f' => '女性',
 },
 ...
);

みたいにして
each %{$var{$list[2]}}
とすると、eval使わなくていいけど。
0361nobodyさん2006/07/09(日) 20:04:15ID:???
どうしてこう変数名を使ってなにかをしたがる奴が多いのだろうか。
デバッガ作るんでもなけりゃ名前をキーにしたハッシュにしとけよ。
0362nobodyさん2006/07/09(日) 20:39:33ID:???
てぃむどぅでぃはいいけど、せめて use strict 通るのにしたいね。
0363nobodyさん2006/07/10(月) 09:14:03ID:???
perlでサービスというか常駐プログラムを作りたいんだが
メモリの取得とか開放とか 変数使ったときの内部の挙動が
いまいち心配なのですがどうしたらよいでしょうか
0364nobodyさん2006/07/10(月) 09:41:10ID:???
>>363
perlのGCはリファレンスカウントなので循環参照を作って使い
捨てるとメモリリークになる。これに注意すれば無限に太り続ける
ことはないだろう。

perlは基本的にosからとったメモリは返さないので、一度でも大量に
メモリを使うと太ったままになる。それが困るようならたまにexecする
ぐらいしか手はない。

例外もあるがくわしくはperlfaq3の

How can I free an array or hash so my program shrinks?

参照。
0365nobodyさん2006/07/10(月) 16:54:29ID:kBFNwS+A
2つの配列に同じ要素を代入したいんですが
pushで複数の配列に同時に要素を代入する方法ってありますか?
0366nobodyさん2006/07/10(月) 17:07:07ID:???
>>365
pushにそんな機能は無い
0367nobodyさん2006/07/10(月) 17:18:03ID:kBFNwS+A
>>366
ありがとうござました。
おとなしく、2つ目の配列に1つ目の配列を代入します。
0368nobodyさん2006/07/10(月) 17:46:11ID:???
それより同じ配列を二つ用意しない方法を考えた方がいい気がするけど
0369nobodyさん2006/07/10(月) 18:08:23ID:kBFNwS+A
>>368
数字を、片方はそのまま(データ処理用)、
もう片方はコンマ付き(ブラウザ表示用)、
と分けようとしたとき、その過程でどこかに
同じ配列を用意しないといけないと思っていました。
そうしなくても良い方法ってありますか?
0370nobodyさん2006/07/10(月) 18:14:45ID:???
「同じ要素」 って言ってなかったっけw
0371nobodyさん2006/07/10(月) 18:16:43ID:???
ブラウザ表示する時にはじめてカンマつけて出力すれば?
どうせカンマ付きはそこで使い捨てになるんだろうし。
同じ配列2つだと整合性の問題もある。
0372nobodyさん2006/07/10(月) 18:24:39ID:kBFNwS+A
    �@       �A        �B       �C
数字のデータ → 配列A → 素のデータ  →   処理
         → 配列B → コンマ付きデータ → ブラウザ出力

という流れを想定しての質問でした。

>>370
確かに結果的には別の要素になりますが、その過程(�Aの時点)では
同じ要素を入れる必要があると考えていたので、その局所的な点から
「同じ要素」と言ってしまいました。誤解を与えたならすみません。

>>371
ブラウザに表示するのは1度ではないので、その都度コンマを付けるより
初めから別に配列のデータを作って代入した方が良いかと思っていました。
整合性の問題については具体的には良く分かりません。
0373nobodyさん2006/07/10(月) 18:27:23ID:???
>>372
(3) の時点で配列のコピーつくればいいんじゃ?
var Array2 = Array1.concat(); とかして
0374nobodyさん2006/07/10(月) 18:33:57ID:???
>>372
>整合性の問題については具体的には良く分かりません。
途中で素のデータの方に変更がかかると
コンマ付きの方と値がズレるかも、ということ。
素のデータを更新したら、その都度、コンマ付きの方も更新しないといけない。
そういう心配をするなら、一つにしといた方が間違いが無い。
0375nobodyさん2006/07/10(月) 18:50:46ID:kBFNwS+A
>>373
(2)の段階で配列を2つ作ることと
(3)の段階で配列のコピーを作ることとの違いが分かりません。

>var Array2 = Array1.concat();
こういうのは見たことがないんですが、
配列のコピーというのはそういったテンポラリファイルとしてコピーする
モジュールか何かがあって、それを使うということでしょうか?

>>374
ご説明ありがとうございます。
配列に代入した後にデータを変更することはないので
その点については大丈夫です。
ただ、そういう考え方は重要ですね。
03763632006/07/10(月) 18:52:56ID:???
>>364
ありがとうございまんこ
変数はローカル変数でも消費しちゃうのかな
とりあえず、perlでデーモンはいったんあきらめてみます
0377nobodyさん2006/07/10(月) 19:12:46ID:???
>>375
> 配列に代入した後にデータを変更することはないので
今の処理ではそうでも、何か拡張したときに変更するかも知れない。
データは1つだけ持っておき、出力時に変換関数を通すほうが安全。

同一データを変換する処理が数百回にも及ぶため、変換後のデータをキャッシュしておきたい、
というような要求に見えるが、安全性からはオブジェクトにして、データへの変更時には、
キャッシュも必ず更新されるようコーディングすべき。
0378nobodyさん2006/07/10(月) 19:41:21ID:kBFNwS+A
>>377
アドバイスありがとうございます。

例えば、ブラウザに直接表示される部分はコンマ付きの値を
同時にフォームのhiddenでコンマ無しの素の値を、それぞれ置いておく
と言った場合には、局所的にせよ、やはり同じ配列を用意して
片方だけをコンマ付きにする必要があると思うんですが、
どうでしょうか?
0379nobodyさん2006/07/10(月) 19:46:27ID:???
もうどっちでもいいよ、君の好きなようにすればいい。
0380nobodyさん2006/07/10(月) 19:51:23ID:???
なんで一時的にしか使わないコンマ付きの値を、
配列全体に渡って作ろうとしているのか、そこが不明。

どうせ表示して終わりなんでしょ?
だったら、テンプレートにフィルタかけて、
表示側だけコンマ付きにすることもできるのに。

まぁ重複管理したければどうぞ。
0381nobodyさん2006/07/10(月) 20:01:11ID:???
初心者スレとは思えない厳しさだな。おまえらw
0382nobodyさん2006/07/10(月) 20:11:58ID:kBFNwS+A
>>379
はぁ・・・そうですか。
気分を害されたようでしたらすみません。
別段口答えしようというわけではなく、
指摘されたようなデータの保持の仕方は
理想的で、常にそうあるよう心掛けるべきだとは思いましたが、
どんな場面でも適用できるのか疑問に思ったので
しつこく質問してしまいました。
すみませんでした。

>>380
>なんで一時的にしか使わないコンマ付きの値を、
>配列全体に渡って作ろうとしているのか、そこが不明。
例えば、「数字をフォームに入力し、その数字について確認する
確認時には見やすいようにコンマ付けされた数字をブラウザには表示する
しかし、それとは別にhiddenで素の数字を置いておく」
といった場合のやり方をするためには、同じ配列を用意して
片方の配列のみコンマ付け仕様にする、という方法しか思いつかなくて
そうしていました。
ちなみに、配列内全てが入力された数字の情報なので、配列全体に渡って
コンマ付きの値を作る必要があるという流れになりました。

>だったら、テンプレートにフィルタかけて、
>表示側だけコンマ付きにすることもできるのに。
この方法については知りませんでした。
具体的にどういうことかはよく理解できませんが、
これ以上の質問はスレ汚しになりそうですし
お怒りを買いそうなので、これにて失礼します。

レス下さった方々ありがとうございました。
気を悪くされた方々、悪意はありませんでした。すみませんでした。
0383nobodyさん2006/07/10(月) 20:24:53ID:???
>>382
379だけど、
別に気分害したわけでもなく、単にどっちでもいいと思っただけw
好きなように書かないと楽しくもないし、そっちのがお手軽なら、そうすればいいんじゃね? みたいな。
せっかく perl なんだから、1つの方法にこだわることないし。
>>380 とかだって、よりいいやり方もあるよ、って示しただけだしね。
0384nobodyさん2006/07/11(火) 00:36:18ID:???
要は保存用の配列と表示用の配列ってことでしょ?

メモリ上の配列を弄ってもデータファイルには影響ないのだから、データ保存完了後に
好き勝手弄ればいい
0385nobodyさん2006/07/11(火) 10:15:27ID:???
mod_perlか何かで、カンマ付きの値もずっと持ち回るなら、
あるいはパフォーマンス上、別データとして保存する利点もある。

しかし、同一の値を1回だけ出力するという今回の質問では不要。
元データだけ持っておき、出力時に変換すれば十分。
というか、メモリの無駄使い。
■ このスレッドは過去ログ倉庫に格納されています