我有一個檔案被讀取并分成 %ojects,%objects 填充如下所示。
$VAR1 = 'cars';
$VAR2 = {
'car1' => {
'info1' => '"fast"',
'info2' => 'boring'
},
'car2' => {
'info1' => '"slow"',
'info2' => 'boring info'
},
'car3' => {
'info1' => '"unique"',
'info2' => 'useless info'
}
};
$VAR3 = 'age';
$VAR4 = {
'new' => {
'info3' => 'rust',
'info4' => '"car1"'
},
'old' => {
'info3' => 'shiny',
'info4' => '"car2" "car3"'
}
}
};
我的目標是在資料庫中插入諸如“car1 fast rust, car2 slow Shining, car3 unique splash”之類的資料,但我無法得到例如“基于年齡資訊4的銹跡匹配”..
my $key = cars;
my $key2 = age;
foreach my $obj (keys %{$objects{$key}}) { # for every car
@info1s = $objects{$type}{$obj}{'info1'} =~ m/"(.*?)"/g; # added to clean up all info1
foreach my $infos ($info1s) {
dbh execute insert $obj $infos # this gives me "car1 fast, car2 slow, car3 unique"
}
...
有人可以指出我正確的方向來獲取和存盤帶有相關資訊 1/資訊 2 的資訊 4 嗎?
謝謝!
uj5u.com熱心網友回復:
我認為目標如下。在最深層的 hashref 中獲取 ( info4) 鍵的值$VAR4,并在 hashref 中找到它們作為頂級鍵$VAR2。然后將它們與來自 ( info3) 鍵的值、它們自己$VAR4最深級別 hashref 中的“兄弟” 以及info1來自的鍵 ( )的值相關聯$VAR2。
為此,可以手動遍歷結構,特別是如果它始終具有如圖所示的相同的兩個級別,但使用庫會更容易和更好。我使用Data::Leaf::Walker獲取葉子(最深的值)和它們的關鍵路徑,使用Data::Diver獲取已知路徑的值。
use warnings;
use strict;
use feature 'say';
use Data::Dump;
use Data::Leaf::Walker;
use Data::Diver qw(Dive);
my $hr1 = {
'car1' => { 'info1' => 'fast', 'info2' => 'boring' },
'car2' => { 'info1' => 'slow', 'info2' => 'boring info' },
'car3' => { 'info1' => 'unique', 'info2' => 'useless info' }
};
my $hr2 = {
'new' => { 'info3' => 'rust', 'info4' => 'car1' },
'old' => { 'info3' => 'shiny', 'info4' => 'car2 car3' }
};
my $walker = Data::Leaf::Walker->new($hr2);
my %res;
while ( my ($path, $value) = $walker->each ) {
next if $path->[-1] ne 'info4';
# Some "values" have multiple needed values separated by space
for my $val (split ' ', $value) {
# Get from 'info4' path the one to its sibling, 'info3'
my @sibling_path = ( @{$path}[0..$#$path-1], 'info3' );
# Collect results: values of `info3` and `info1`
push @{$res{$val}},
Dive( $hr2, @sibling_path ),
Dive( $hr1, ($val, 'info1') );
}
}
dd \%res;
為簡單起見,這假設了一些事情并采取了一些捷徑。
一方面,我使用問題中的顯式infoN鍵和兩級結構。如果資料不同,或者可以不同,這應該不難調整。
接下來,這假設像這樣的值car1總是作為另一個 hashref 中的鍵存在。exists如果它可能不作為密鑰存在,則添加對該密鑰的檢查。
我從資料中洗掉了一些額外的引號。(如果這是用于資料庫條目,請在構造陳述句時執行此操作。如果資料帶有這樣的額外引號,則應該很容易調整代碼以將它們考慮在內。)
上面的程式列印
{
car1 => [“銹”,“快”],
car2 => [“閃亮”,“慢”],
car3 => [“閃亮”,“獨特”],
}
(I use Data::Dump to display complex data structure, for its simplicity and default compact output.)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/316254.html
上一篇:Python-將perl作為子行程呼叫-等待完成其后臺行程并列印到shell
下一篇:當前包宣告的子程式串列
