Perlのハッシュのリファレンスを使ってみたいと
思いましたがうまく動きませんでした。
よろしくお願い申し上げます。
ファイル(inifile.txt)からPerlで
UserNameとTargetの値を
hanako,11111
tarou,2222
の様に出力したいのですが。
tarou,2222
tarou,2222
と成ってしまいうまくいきません。
--inifile.txt----------
Mode=True
UserName=hanako
DeleteMode=True
Target=11111
TouchDateMode=False
Mode=True
UserName=tarou
DeleteMode=True
Target=2222
TouchDateMode=False
--------------------
--test.pl---
while($line=<DATA>) {
# my $info={}; #これを入れるとTargetは入りました
chomp($line);
if($line=~/UserName/){
$line=~s/UserName=//;
$info->{UserName}=$line;
}elsif($line=~/Target/){
$line=~s/Target=//;
$info->{Target}=$line;
push @$infos,$info;
}
}
foreach my $k(@$infos){
my @line2=(
$k->{UserName},
$k->{Target});
print join(",",@line2)."\n";
}
__END__
Mode=True
UserName=hanako
DeleteMode=True
Target=11111
TouchDateMode=False
Mode=True
UserName=tarou
DeleteMode=True
Target=2222
TouchDateMode=False
No.1ベストアンサー
- 回答日時:
$info が宣言されていないので、グローバル変数として扱われます。
それを $info->{} として使った時点で
$info = 無名のハッシュ(これをH0とする)のリファレンス
となります。以降、 $info->{} は H0 を操作することになります。
while($line=<DATA>) {
が終った時点で、H0は最後に操作した内容となります。
push @$infos,$info;
では、 @$infos に $info 、つまり「H0のリファレンス」 を追加します。
よって、実行したら
$infos = [ 「H0のリファレンス」,「H0のリファレンス」 ]
という状態になります。
そんため
foreach my $k(@$infos){
では、「 H0のリファレンス」への処理を2回繰り返すことになります。
H0の内容は、「最後に処理された状態」ですから、最後のtarou,2222 だけが繰り返されます。
このような現象は、リファンレンスを使う言語ではよくあることです。
「浅いコピー」「深いコピー」といった用語が使われていますので、これで検索してみましょう。
対策は、 @$infosに 「H0と同じ内容の別のハッシュ」をpushすることです。
例えば
push @$infos, {%$info};
# %$infoと H0を展開したものを新しい無名のハッシュにして、それをpushする
など。
> # my $info={}; #これを入れるとTargetは入りました
この方法では、 ループ毎に新しいハッシュが用意されます。
そのため、UserとTargetのときとでは、「別のハッシュ」への操作となります。
そのため、 pushするときの$info、すなわち Targetだけが入ったハッシュが $infosに追加されます。
ありがとうございます!
意図したとおりの動きになりました!
新しいリファレンスを作る?とういことですか。
大変勉強になりました他に応用していきたいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) [Excel VBA] このコードでは行の挿入や行の消去をすると13のエラーが出てしまう。 3 2022/12/09 00:29
- Visual Basic(VBA) シート削除のマクロで「deleteメソッドは失敗しました」となります。助けてください! Sub 不要 6 2022/09/08 16:41
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) vba 重複データ合算 5 2023/07/05 18:55
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) エクセルVBA(実行時エラー438)の対処法を教えてもらえないでしょうか 3 2023/04/22 13:43
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
文字列を変数名として扱う方法
-
動的なハッシュの配列を作成したい
-
ハッシュ検索はなぜ速い
-
まったく同じファイルのハッシ...
-
短いハッシュの作り方
-
ハッシュリストって単にハッシ...
-
データベースでユーザーのパス...
-
静的ハッシュの配列のキーに対...
-
画面を強制的に再描画させる方法
-
DoEventsが必要な理由について
-
VBのReturnの使い方
-
VBAのautofilter、criteriaの配...
-
VBAでの一時停止と再開の方法
-
アクティブセルから、A列最終行...
-
エクセル関数で1〜12の数字がル...
-
Do whileでExitせず、ループの...
-
vbscriptでIE自動入力(途中で...
-
「VC++6」ウィンドウの再描画
-
CSVファイルの特定の行だけを読...
-
delphi の 標準偏差のプログラ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ハッシュ検索はなぜ速い
-
文字列を変数名として扱う方法
-
チェックデジットについて
-
ハッシュのハッシュを実現したい。
-
まったく同じファイルのハッシ...
-
列挙型と連想配列の違いを教え...
-
重複ファイルを削除したいので...
-
*(アスタリスク)の意味
-
短いハッシュの作り方
-
英語でのシャープとコメの呼び...
-
ハッシュマーク以降のアドレス取得
-
一意(ユニーク)かつ、ソート...
-
Perlは戻り値で、ハッシュや配...
-
ハッシュリストって単にハッシ...
-
ActivePerl がハングアップ
-
多次元配列から重複を削除
-
mapのポインタ
-
Perlのハッシュ変数のソートに...
-
Perlのサブルーチンの引数に配...
-
文字数の短いユニークなID生成
おすすめ情報