こんばんは。いきなりですが、質問があります。

CGIで動的にHTMLを作成したのですが
あるページに多数ユーザが接続しようとすると
フリーズしてしまいます。
調査してみたところ、Perlが実行時にメモリを
多く確保しているためのようです。
また、そのページではフレームを使用しているため、
1ユーザに複数プロセスが起動されるので、
それもメモリ不足の原因ではと思っています。

メモリの使用量を下げようとしているのですが、
知識足らずなため、思うようにいきません。

どなたか良い方法をご存知でしたら、
教えていただきたいのですが。

よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

あ、今見返していたらバグが。

すみません。
sub my_function {
my ($bigbigbig_data_ref) = @_;
for my $data (@$bigbigbig_data) {

for my $data (@$bigbigbig_data_ref) {
ですね。
なんか読み返すと、tayahaさんを初心者と決めつけてるようなところ
があって…お気を悪くしたらごめんなさい。

もしご存知無かったら、ということなのですが…そうそう、
サブルーチンの返り値となる変数もmyして結構ですよ。
sub my_func {
my $abc;
....
return $abc;
}
my_funcを呼び出した側で$abcを使ってる場合はmy_funcを抜けても
$abcは掃除されることはありません。(my_funcを呼び出した関数が
終わったときに掃除されます)
要するに、基本的になんでもmyを付けましょう、ということです。
perl -w オプションとuse strict;を使いましょう。
グローバル変数についても
use vars qw(@MY_GLOBAL_ARRAY);
として、明示的にグローバルとして使う!と宣言してないものがあれば
警告してくれます。
    • good
    • 0

いくつかチェックポイントはあると思います。


まず、そのCGIは本当に必要か。普段は静的なHTMLページを表示して、
情報が更新されたときだけそのHTMLページを更新するようなことです。
掲示板でも最近多いですよね。ただ見るときだけのときは「~xxx.cgi」
ではなくて「~/xxx.html」を閲覧するようなもの。それで済むなら
そうしましょう。

次に、やはりプログラムのシェイプアップでしょうか。これには、さまざま
な場合があるのでひとくちにご説明するのは無理ですが、よく見かける
ものを念頭にちょっとだけポイントを書いてみます。

・ファイルの中身を @data = <FILE> といった調子で丸ごと読みこんで
いる個所があったら、
while (<FILE>) {
}
の形に直しましょう。確保されるメモリが1行分で済むようになります。

・グローバル変数を多く使ってるならなるべく局所変数にしましょう。
$abcがforループの中でしか参照されないのだったら、
my $abc;
for $abc (@array) {
$abc = ....
}
よりも
for $abc (@array) {
my $abc = ....
}
のほうが、いいということです。ループを抜けるときに掃除されますから。
サブルーチンでも同様です。サブルーチンの中だけ使うのならそこで
my。

・サブルーチンを呼び出すとき、配列やハッシュを引数として受け渡しする
かわりにリファレンスを渡す。
&my_function(@bigbigbig_data);
....
sub my_function {
my (@bigbigbig_data) = @_;
for my $data (@bigbigbig_data) {
.....
}
よりも、
&my_function(\@bigbigbig_data);
....
sub my_function {
my ($bigbigbig_data_ref) = @_;
for my $data (@$bigbigbig_data) {
.....
}
の方がベターということです。Perlのサブルーチン呼び出しはコピーに
なります。上記の例であれば@bigbigbig_dataが丸ごとコピーされることに
なります。ここでリファレンスを渡すようにすると、リファレンスそのもの
だけがコピーされ、両方とも同じものを指す、すなわち余分なメモリを食わなく
なるわけです。まあこれは程度問題で、$abc = 123とかの小さいデータを
渡すときにもムキになってリファレンスにする必要はありませんが。

他にも、細かいテクニックはいろいろあります。(ラクダ本の後ろの
ほうにあるメモリを節約するテクニックについて解説した章も参考に
してください)

以上をやってもキツい場合、ちょっと細かいテクニックになりますが、
セマフォを使って制限できる場合もありますね。
乱暴に言えば、flockを一度に単数のアクセスに制限するものとするなら
一度に複数のアクセスを許すロックみたいなものです。
詳しくはperldoc -f semctlやperldoc IPC::Semaphoreをご覧ください。
OSによっては使えない場合もあります。

まあ、自前でロックファイルを作るような形で、セマフォにあたるものを
作成する方法もできなくはないでしょう。
20個なら20個のアクセスまでを許し、それを越えていたら20以下になるまで
スリープする、あるいはエラーページを吐いて終わるような仕掛けを。

あと、大胆に、CGIのいくつかを他のサーバにおいてそっちで起動するように
する方法もあるでしょう。

------
たしかにサーバ側でコネクションを絞る手もありますね。例えば
ApacheだとMaxClientsやMaxSpareServersで設定することになるんでしょうか。
でも1.3ぐらいだと、全体でのDirectoryごとに細かくコネクション数を
設定できなかったような記憶があります。CGI以外の静的ページについても
制限することになりますね。まあ、背に腹は代えられないってことですかね。
それとも最近のバージョンだと違うのかな?また別のサーバなら話はまったく
異なるでしょうね。
    • good
    • 0

一般的にはwebサーバがわでマックスのコネクション数を設定できるので


それで制御しましょう。
もしwebサーバをいじれないのなら、perlプロセスの数をpsコマンドで数えて
多かったら「不可が高いです」だけだして即終了してしばらくまってもらうとか
そうすれば最悪の事態は確率的に回避できます。

でも、一番懸命なのはスクリプトをもう一度みなおして無駄に変数を
つかってないか確認してみましょう。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QDDR3-1066のメモリを2GBに、上位互換?

旅行の際にモバイルPCのいささか古い規格のPCを使っていましたが、ぼちぼち新規購入を考えています。

例えば価格ドットコムを見て、acerのAOD257-A71Cの購入を考えています。
acerの情報としては、メモリの規格が、DDR3-1066/PC3-8500となっています。
恐らく、多くの方が1GBメモリを2GBに交換したいと思うのですが・・・
IOデータで検索すると、DDR3-1333/PC3-10300と答えを返してきます。
DDR3-1333/PC3-10300で問題が無いのでしょうか?
上位互換の方が有利な点があるのでしょうか?


質問1)主題)
IOデータの指定のDDR3-1333/PC3-10300って、上位互換と考えて問題ありませんか?
DDR3の規格内であれば、上位を選んでも問題が無いのでしょうか。
上海市場には、安いDDR3-1066/PC3-8500規格のサードパーティー製の2GBがあるのですが、そちらで充分なのでしょうか?

質問2)副題)おまけの質問です
モバイルPCは、ほとんどがWIN7-Starterだと分かりました。
WIN7-Starterは、メモリ2GBが想定されているはずなのに1GB機種しか見当たりません。
何故なのでしょうか?数百円の差であれば、最初から2GBを搭載した方が売れると思うのですが。
何故メモリ2GB機種が無いのでしょうか。

旅行の際にモバイルPCのいささか古い規格のPCを使っていましたが、ぼちぼち新規購入を考えています。

例えば価格ドットコムを見て、acerのAOD257-A71Cの購入を考えています。
acerの情報としては、メモリの規格が、DDR3-1066/PC3-8500となっています。
恐らく、多くの方が1GBメモリを2GBに交換したいと思うのですが・・・
IOデータで検索すると、DDR3-1333/PC3-10300と答えを返してきます。
DDR3-1333/PC3-10300で問題が無いのでしょうか?
上位互換の方が有利な点があるのでしょうか?


質問1)主題)
IOデ...続きを読む

Aベストアンサー

> 質問1)主題)
> IOデータの指定のDDR3-1333/PC3-10300って、上位互換と考えて問題ありませんか?

・はい。
上位互換です。
メモリには、これまで相性問題が常にありました。
最新のDDR3規格メモリでようやく、相性問題が一段落した感じです。

> 質問2)副題)おまけの質問です
> モバイルPCは、ほとんどがWIN7-Starterだと分かりました。
> WIN7-Starterは、メモリ2GBが想定されているはずなのに1GB機種しか見当たりません。
> 何故なのでしょうか?数百円の差であれば、最初から2GBを搭載した方が売れると思うのですが。
> 何故メモリ2GB機種が無いのでしょうか。

・メモリ1GBはマイクロソフト社がウインドウズ7スターターを低価格で供給する際の制限です。
ネットブックよりも薄く軽い「ウルトラブック」や「UMPC」は、通常版のウインドウズ7が搭載されています。
当然ながら、CPUの性能制限もなく、搭載されメモリも4GB以上搭載出来ます。

ネットブックに「CPU性能やメモリ搭載量を制限する」ことを条件にマイクロソフト社はウインドウズスターターを低価格で供給しています。

ネットブックの「CPU性能やメモリ搭載量の制限」を撤廃したら、セルロンCPUを搭載した低価格帯ノートPCが売れなくなります。
それじゃあ!たまらん!!!
と言うことで、、、マイクロソフト、CPUメーカー、パソコン製造メーカーが話し合った結果、ネットブックには「CPU性能やメモリ搭載量の制限」をかける。
その代わりにマイクロソフトはウインドウズスターターを低価格で供給する事になった次第です。

ネットブックの制限は以下リンの通りです。
少しずつ、制限は緩和されています。
現在はデュアルコアOK。
ディスプレイも10.2インチ以上が搭載出来るようになりました。
しかし、メモリ1GB以下は、まだ緩和されていません。
http://bto-pc.jp/btopc-com/select/windows-7-starter.html

では、なぜ、「CPU性能やメモリ搭載量の制限」があるネットブックが誕生したのか?
近年、先進国と発展途上国の間で、情報格差が広がりつつあると国連が発表しました。
情報機器が発達しないと(使えないと)国や国民が豊かにならない。
情報機器が発達した国と未発達の国の間で貧富が今後広がる。

国連が主導のもと、100ドルPCが企画され、アフリカ諸国などで急激に広がっています。
この100ドルPCの計画&企画に対して、なんと、国連からインテル社とマイクロソフト社に一切声が掛からなかった。
そして、100ドルPCはリナックスベースで製品化されました。

途上国でリナックスが幅を利かせると、将来、ウインドウズとインテルCPUのシェアが下がる可能性がある。
このシェア低下を防止する目的で、100ドルPCに対抗すべく企画されたのがネットブックということです。
ネットブックは最低セット300ドル未満で企画されました。
実際に販売を開始したら、皮肉にも、先進国のユーザーがサブマシンとして爆発的に売れた次第です。

リナックスベースの100ドルPC
http://news.mynavi.jp/articles/2008/03/21/olpc/index.html

> 質問1)主題)
> IOデータの指定のDDR3-1333/PC3-10300って、上位互換と考えて問題ありませんか?

・はい。
上位互換です。
メモリには、これまで相性問題が常にありました。
最新のDDR3規格メモリでようやく、相性問題が一段落した感じです。

> 質問2)副題)おまけの質問です
> モバイルPCは、ほとんどがWIN7-Starterだと分かりました。
> WIN7-Starterは、メモリ2GBが想定されているはずなのに1GB機種しか見当たりません。
> 何故なのでしょうか?数百円の差であれば、最初から2GBを搭載した方が売れる...続きを読む

QPerlのプロセス

Windowsでホームページを公開しています。

ActiveState Perl5.8.7
Apache 2.0.54 (Win)

サービスでApacheを停止してもタスクマネージャーを見ると
perlのプロセスが4つほどあり、DocumentRootのフォルダを削除しようとしても
できません。通常Apacheの管理下なので、サービスを止めると、
ファイルの書き換えは出来ると思いますが、パールのprocessが残っているせいか
入れ替えができません。Windowsを再起動すれば良いかもしれませんが
ファイルの入れ替えごとに再起動は苦痛なので、PerlのプロセスをKILLできる方法が
知りたいです。TASKMGR.EXEで殺すことはできませんでした。

いつまでもperlのプロセスが残るので、何かソフトか対策はあるのでしょうか?

後、予断ですが Windowsでサーバー立てるのは危険でしょうか?

Aベストアンサー

perlのプロセスが残る理由は分かりませんが、
TASKMGR.EXEで殺すことのできないプロセスを、
リソースキットのKill.exeで殺せる場合があります。
以下のサイトにもあります。

MUST- HAVE UTILITIES
http://www.mattkruse.com/utilities/

Kill.exe and tlist.exe

参考URL:http://www.mattkruse.com/utilities/

Qメモリの種類による違い(DDR2、DDR3)について

メモリの種類による違い(DDR2、DDR3)について

この度、ノートパソコンのメモリをいじろうと思っています。そこでDDR3の導入を考えているのですが、DDR2に比べて実際どれくらい違うものなんでしょうか?(体感速度など) どちらも使った事がある方、教えて下さい。

ちなみに、現在はDDR2の2GBが1枚挿さっていて、次のような変更を考えています。
<パターン1>
DDR2 2GBを1枚追加し、デュアルチャンネル4GBに。そして多すぎる分をRAMディスクとして使用。
<パターン2>
元のメモリは別のものに使い、DDR3 1GBを2枚に。合計2GB。

DDR3がなかなか速いなら、パターン2にしてみようかなと思うんですが・・・。

そもそもDDR3は使えるんでしょうか。僕が理解してないだけで、実は「同じSO-DIMMでもDDR3は挿さらねぇよ」とか「物理的に挿さっても、マザボがついてかねぇよ」みたいな事もあったりするんでしょうか? ノートパソコン本体は ASUSのUL20Aです。

質問がゴチャゴチャしてて申し訳ないですが、回答いただければ助かります。

メモリの種類による違い(DDR2、DDR3)について

この度、ノートパソコンのメモリをいじろうと思っています。そこでDDR3の導入を考えているのですが、DDR2に比べて実際どれくらい違うものなんでしょうか?(体感速度など) どちらも使った事がある方、教えて下さい。

ちなみに、現在はDDR2の2GBが1枚挿さっていて、次のような変更を考えています。
<パターン1>
DDR2 2GBを1枚追加し、デュアルチャンネル4GBに。そして多すぎる分をRAMディスクとして使用。
<パターン2>
元のメモリは別のものに使い、DDR3 1GBを2...続きを読む

Aベストアンサー

規格が違うのでまず無理です↓ネットで調べたらすぐ解りますが <パターン1>が良い使い方になります
http://www.intel.co.jp/jp/support/motherboards/desktop/sb/CS-012038.htm
http://ascii.jp/elem/000/000/124/124257/
http://homepage2.nifty.com/kamurai/MEMORY.htm

Q動的な? 多次元ハッシュ

text---------------------
社会\t1
社会\t社会問題\t4
社会\t社会問題\t教育問題\t5
---------------------text

タブ区切りのテキストファイルを読み込んで
最後の値がハッシュ値になるような
深さがまちまちな多次元ハッシュをループで作りたいのです

手作業だと
$HASH{社会}=1
$HASH{社会}{社会問題}=4
$HASH{社会}{社会問題}{教育問題}=5

できるだけ動作を軽くしたいので、evalや$1での置き換え等は
使いたくないのです
どなたか教えてください

Aベストアンサー

>キー自体を使いたい(splitするコストがかかりますよね)
キー自体は、読み出す時にsplitするのだろうし、キーと値が切り出せれば別にsplitする必要もなく、'\t'を'/'にする必要もない(タブそのままでも良い)ですし、
ハッシュから値を読み出す時にも、キーが既に別々になっている状態で
$key1."/".$key2
のように連結すればいいだけのことで、
かえってテキストファイルによって動的に深さが決まるようなキーの場合、
%HASH{$key1}{$key2}…のような形で動的に深さを決定してアクセスするのが面倒です。

>いかんせん大量のデータ数&量を処理しようとしているので、なるべく軽くと思ってます
読み込みの部分が大量にあるとしても、それほど、重くなるとも思えません。
ハッシュからのアクセスの部分で言えば、かえって手順が簡単だと思います。

#3で指摘されているように、構造としてもうまく行かない場合があるようです。
#3でも言われているように、大量にデータがあるようなハッシュの場合、データの構造を変更して、DBに接続したハッシュにするのも1つの方法だと思います。

>キー自体を使いたい(splitするコストがかかりますよね)
キー自体は、読み出す時にsplitするのだろうし、キーと値が切り出せれば別にsplitする必要もなく、'\t'を'/'にする必要もない(タブそのままでも良い)ですし、
ハッシュから値を読み出す時にも、キーが既に別々になっている状態で
$key1."/".$key2
のように連結すればいいだけのことで、
かえってテキストファイルによって動的に深さが決まるようなキーの場合、
%HASH{$key1}{$key2}…のような形で動的に深さを決定してアクセスするのが面倒です。
...続きを読む

QDDR3 677MHZ メモリ

DDR3 677MHZのメモリ(デュアルチャンネル)が搭載されているPCにDDR3 533MHZのメモリを付けたら動きますか?

よろしくお願い致します。

Aベストアンサー

Pentium4 EEはFSBが1,066MHzと言う所がプレミアになっているだけです。

ExtremeEditionの看板を背負っている為にプレミア価格が設定されています。

性能面で言えば同じ周波数のPentium4と比較して、10%程度の性能向上はありえます。
(処理内容によってはもっと向上しますが)

一般的には周波数の高いPentium4 670を選択したほうが費用対効果は高いので無理に選択する必要はありませんよ。

デュアルコアはシングルスレッドのソフト(現在リリースされているソフトの90%以上)では性能を十分に発揮できず、シングルコアの同クロックのCPU以下の性能しか発揮されなかったりします。

ただ、最近では常時ウィルス対策ソフトなどが常駐していますので、デュアルコアだとそういった物を起動中でも性能低下が起こりにくいのが利点となります。

Pentium4 EEを選択するぐらいならVGAカードを最上位の物に変更するほうが費用対効果が高いですね。


余談ですが、デュアルコアのエクストリームエディションはPentium eXtreme Editionですので略すとPentiumXEとなります。
微妙に紛らわしいですがEEとXEでは別物ですので勘違いされないようにとの配慮ですかね。

Pentium4 EEはFSBが1,066MHzと言う所がプレミアになっているだけです。

ExtremeEditionの看板を背負っている為にプレミア価格が設定されています。

性能面で言えば同じ周波数のPentium4と比較して、10%程度の性能向上はありえます。
(処理内容によってはもっと向上しますが)

一般的には周波数の高いPentium4 670を選択したほうが費用対効果は高いので無理に選択する必要はありませんよ。

デュアルコアはシングルスレッドのソフト(現在リリースされているソフトの90%以上)では性能を十分に発揮で...続きを読む

Qperlでゾンビプロセスが発生

お世話になります。

サーバーの変更後に、
それまで使っていたCGIでゾンビプロセスが発生するようになってしまいました。

以前のサーバーはFreeBSDでそのような事がなかったのですが、
新しいサーバーCentOS5になってから発生するようになってしまったのですが
どのような原因が考えらますでしょうか。

perlやSSIを使った時にだけ発生してしまいます。

色々しらべてはみたのですが、

mod_cgid.so

SSIではこれを無効にすればよいと言うのを見かけまして apache2のhttpd.confを見てみたのですが
LoadModule cgi_module modules/mod_cgi.so のみで
存在していませんでした。


同じプログラムでサーバー変更前はゾンビプロセスは全く発生しなかったのですが、
変更後に今まで大丈夫だったすべてのCGI(perl)プログラムで
ゾンビプロセスが発生するようになってしまいました。

ゾンビプロセス自体は、発生後に消える状態ではあります。


これだけの情報では予測もつかないと思いますが、
もし何かこれが原因では・・・と言うのがございましたらご教授いただけますと幸いです。


お手数をおかけしますが、何卒よろしくお願い致します。

お世話になります。

サーバーの変更後に、
それまで使っていたCGIでゾンビプロセスが発生するようになってしまいました。

以前のサーバーはFreeBSDでそのような事がなかったのですが、
新しいサーバーCentOS5になってから発生するようになってしまったのですが
どのような原因が考えらますでしょうか。

perlやSSIを使った時にだけ発生してしまいます。

色々しらべてはみたのですが、

mod_cgid.so

SSIではこれを無効にすればよいと言うのを見かけまして apache2のhttpd.confを見てみたのですが
LoadModule cg...続きを読む

Aベストアンサー

>ゾンビプロセス自体は、発生後に消える状態ではあります。

ゾンビプロセスの意味を理解されていますでしょうか?
消えるなら問題ありません。正常です。
通常、プロセスは終了するとプロセステーブル上でゾンビプロセスという状態になり、親プロセスからwaitされて、プロセステーブルから消えます。

「いままでゾンビプロセスでいる時間はミリ秒単位で、気づかなかったが、ゾンビプロセスでいる時間が長くなって、人間がpsでみるとしばしば見かけるようになった」
ということであれば、親プロセスの処理が重くなったとかでしょうかね。

QDDR2とDDR3のメモリの違い(素人)

DDR2とDDR3のメモリの違い(素人)

DDR3のほうが優秀です速いです みたいなことをメーカーは謳ってますが、
実際に体感できるほど違いはあるのでしょうか?
ちなみに、やることはリネージュ2程度の3Dゲームです。

Aベストアンサー

>内部処理的にはDDR3はトリプルチャネル対応って事で速いと言えます
結構ここのサイトを見ているとこの手の勘違いをしている人が時々いますね。
DDR3のトリプルチャンネルの対応はメモリコントローラが内蔵しているCPUに依存する。
現状Core i7の9シリーズのみ対応。

Q繰り返し構造内での変数の確保の仕方

内部処理の質問になってしまうのですが、

sub Test{
 my($i);
 for($i = 0; $i < 10; $i++){
  my($flag) = 0;
  #何らかの処理...
 }
}

というものがあった場合、
for文中の$flagは繰り返しのたびにmy&変数開放を行ってしまうのでしょうか?

sub Test{
 my($i, $flag);
 for($i = 0; $i < 10; $i++){
  $flag = 0;
  #何らかの処理...
 }
}
の方が良いのでしょうか?

すごく疑問に思い、動作の軽そうな常に後者の方を利用していました。

お答えをよろしくお願いします。

Aベストアンサー

変数展開を行ってしまっていると思います。

for内及びfor外でmy宣言をした場合のそれぞれについて、試しに速度を測ってみたところ、かかる時間の比は

for外 : for内 = 4.60 : 6.10

という結果が得られました。
(for文のループを10000000回にしてためしました)

やはり外で宣言した方が役1.3倍くらい速いようです。
しかしそこまで劇的な差が無いですし、変数名の競合やバグ等の対策を考えればforループ内でしか使わない変数は(perlにおいては)forの中でmy宣言した方がいいのかもしれません。

QDDR3-1066マザーにDDR3-1333メモリ

DDR3-1066まで対応のマザーにDDR3-1333のメモリは使えますか。
使用予定のマザーボードはインテルDG41WVで,同社ウェブによると
>DDR3 1066 MHz および DDR3 800 MHz の DIMM をサポート
とあります。このマザーボードにDDR3-1333のメモリをつけることは可能でしょうか。
いまどきDDR3-1066のメモリなんてノート用しか売っていないしデスクトップ用はあっても高いし,ということで使えるものなら1333を使いたいのですが・・・。
FAQかもしれませんがよろしくお願いします。

Aベストアンサー

下位互換により使用可能です。
1066相当の転送速度に合わされるだけですから、何の心配もいらないですよ。

Q動的なハッシュの配列を作成したい

#お世話になります。最終的には、下記のように配列の順番にハッシュを作成したいのですが、ご教授願えませんでしょうか

#!/usr/bin/perl

#想定される配列
@array=(0,2,4,6,8,1,3,5,7,9);

#下記が最終的に動的に作成したいハッシュの形です。
%List = (
'0' => [ (@array0_n) ],
'2' => [ (@array2_n) ],
'4' => [ (@array4_n) ],
'6' => [ (@array6_n) ],
'8' => [ (@array8_n) ],
'1' => [ (@array1_n) ],
'3' => [ (@array3_n) ],
'5' => [ (@array5_n) ],
'7' => [ (@array7_n) ],
'9' => [ (@array9_n) ], );

$a='array';
$n='_n';
foreach (@array){
#試行錯誤中...
print "\@{${a}[$_]{$n}}=@{${a}[$_]{$n}}";
}

__END__;

お忙しいかとは存じますが、よろしくお願いいたします。

#お世話になります。最終的には、下記のように配列の順番にハッシュを作成したいのですが、ご教授願えませんでしょうか

#!/usr/bin/perl

#想定される配列
@array=(0,2,4,6,8,1,3,5,7,9);

#下記が最終的に動的に作成したいハッシュの形です。
%List = (
'0' => [ (@array0_n) ],
'2' => [ (@array2_n) ],
'4' => [ (@array4_n) ],
'6' => [ (@array6_n) ],
'8' => [ (@array8_n) ],
'1' => [ (@array1_n) ],
'3' => [ (@array3_n) ],
'5' => [ (@array5_n) ],
'7' => [ (@array7_n) ],
'9' =>...続きを読む

Aベストアンサー

ざっと見たところ、リファレンスを使われたいのではないでしょうか。
それと、「最終的に動的に作成したいハッシュ」の%Listについては
'0' => [ (@array0_n) ],
と書かれている通り各keyに対してのvalueは配列が入る事になりますので
@array0_n~@array9_nの要素はハッシュ作成の処理を行う前に用意しなくてはなりませんね。

と、勝手に仮定しまして下記処理を書いてみました。

#---------------------------------------------------

@array=(0,2,4,6,8,1,3,5,7,9);

### 勝手に要素を用意しました
@array0_n=('a','b','c');
@array2_n=('d','e','f');
@array4_n=('g','h','i');
@array6_n=('j','k','l');
@array8_n=('m','n','o');
@array1_n=('p','q','r');
@array3_n=('s','t','u');
@array5_n=('v','w','x');
@array7_n=('y','z','aa');
@array9_n=('ab','ac','ad');

foreach(@array){
my $x="array$_\_n";
$List{$_}=[(@$x)];

print "@$x<br>";
}

#---------------------------------------------------

@arrayの要素番号0~ をハッシュのkeyとして、
valueを(@array要素番号_n)と言う配列名として、
実質、配列要素の順番にハッシュを作成した事になります。

もちろんハッシュを作成する順番の事であって、他の方が言われる通りハッシュのkey,valueの並び順を保障するモノではありません。

#下記が最終的に動的に作成したいハッシュの形です。
結果的に↑になっているのではないでしょうか。

ハッシュに対してシンボリックリファレンスを使って動的に配列を入れてます。(まずいですか?)
ご存知かとは思いますが%Listの各要素を確認するには
print $List{0}[1];
とかになります。

ちょっと質問の情報量が少なめなので
ほとんど推理に近い憶測で書いてみました。

ざっと見たところ、リファレンスを使われたいのではないでしょうか。
それと、「最終的に動的に作成したいハッシュ」の%Listについては
'0' => [ (@array0_n) ],
と書かれている通り各keyに対してのvalueは配列が入る事になりますので
@array0_n~@array9_nの要素はハッシュ作成の処理を行う前に用意しなくてはなりませんね。

と、勝手に仮定しまして下記処理を書いてみました。

#---------------------------------------------------

@array=(0,2,4,6,8,1,3,5,7,9);

### 勝手に要素を用意しま...続きを読む


人気Q&Aランキング