このような簡単なコードを実行すると、次のようになります。
my @arr=(1..5);
my $x;
foreach $x (@arr) {
$x+=10;
}
print "@arr";
$xがforeachの@arr配列の各要素に「なる」ため、結果は「11 12131415」になります。十分です。
しかし、これが私のことです...それほど問題ではありません(解決策は簡単ですが、エレガントではありません。Perlをできるだけエレガントにしたいと思います)。
COBOLデータを処理するためのtieモジュールを作成しました。コピーブックを取得し、フィールドを解析してから、それをスカラー/文字列にアタッチして、結合されたハッシュへのアクセス/ハッシュからのアクセスが文字列の値を返す/設定するようにします。それは素晴らしく機能します。
my %h,$rec;
my $cb=<<END;
01 CH-RECORD.
05 JOB-NUM PIC X.
05 FILLER PIC X(76).
05 REC-TYPE PIC X(2).
END
tie %h, 'COBOLDataTie',$cb,\$rec; #tie the hash to the record via the copybook
そこから、COBOLレコードを$ recに移動し、%hハッシュを使用してCOBOLフィールドにアクセスできます。
繰り返しますが、これは完全に機能します。しかし、問題は、たとえばCOBOLレコードの配列を反復処理したいときに発生します。したがって、上記のコードの後に、次のようなものがあった場合:
foreach $rec (@arr) {
print "Job is ",$h{'JOB-NUM'},"\n";
}
foreachが実際に$recの場所を変更し、それがその結びつきを断ち切るため、機能しません。私はこのようなことをしなければならないことになります:
foreach (@arr) {
$rec=$_;
print "Job is ",$h{'JOB-NUM'},"\n";
}
「foreach$rec(@arr)」を実行して、結び付けられたハッシュを壊さない方法はありますか?
(そして誰もが言う前に、はい、私はこれが素晴らしいオブジェクト指向の解決策を求めていることを知っています...いつか私はそれに到達するでしょう;私は最初に時間を見つけなければなりません)
EPILOGUE:TieHashコードを修正して、外部レコードを指す代わりに、ハッシュの「特別な」キーをインターセプトします。その中には「レコード」があります。したがって、レコード文字列を$ h {'record'}に割り当てると、上記の例で$recをロードするのと同じになります。これははるかに優れたソリューションであり、より自己完結型です。また、よりOOPに似たインターフェースを公開します。