我已經嘗試了@%$s的各種組合,但我無法讓它發揮作用。 完整的運算式可以作業,但我如何將其分割成變數呢?
print "BIGexp"/span>, $tables{"grp"}[1]{_name}, "
"; # OK,列印部分。
my @cols = $tables{"grp"};
print "COLS", @cols, "
"; #列印陣列。
my %col = %cols[1] 。
print "COLvar", %col, " ", "
"; #prints 1?
print "COLexp", $cols[1]{_name}, "
"; ######## Fails, uninitialized.。
我想表示資料庫模式。 因此,一個表的映射,每個表都包含一個列的陣列,每個列都是一個映射。 下面是完整的片段。
my %tables=()。
my $columns; # array
sub addTable{
my @cols = ();
$tables{$_[0]} = @cols;
$columns = @cols;
}
sub addColumn{
my %col = (_name => $_[0], _typ => $_[1] )。)
push(@$columns , \%col)。
}
addTable("grp")。
addColumn("id", "serial") 。
addColumn("part", "integer") 。
addTable("tab2")。
addColumn("foo2", "varchar") 。
addColumn("bar2", "integer") 。
print "BIGexp" , $tables{"grp"}[1]{_name}, "
"; # OK,列印部分。
my @cols = $tables{"grp"};
print "COLS", @cols, "
"; #列印陣列。
my %col = %cols[1] 。
print "COLvar", %col, " ", "
"; #prints 1?
print "COLexp", $cols[1]{_name}, "
"; ######## Fails, uninitialized.。
我是Perl的新手,還沒有成為 "Perl頭腦":(。 非常感謝任何幫助。
uj5u.com熱心網友回復:
你可以使用模塊use Data::Dumper;,以便列印你的資料結構。
print "BIGexp"/span>, $tables{"grp"}[1]{_name}, "
"; # OK,列印部分。
my @cols = $tables{"grp"};
print "COLS", @cols, "
"; #列印陣列。
my %col = %cols[1] 。
print "COLvar", Dumper(\%col), " ", "
"; #prints 1?
print "COLexp"/span>, Dumper(@cols), "
"; ######## Fails, uninitialized.。
print "COLexp" , Dumper($cols[0][1]{_name}), "
"。
而輸出結果是:
BIGexp part
COLS ARRAY(0x800e5f480)
COLvar $VAR1 = {
'1' => undef'_typ' => 'serial',
'_name' => 'id'.
},
{
'_name' => 'part',
'_typ' => 'integer', 'integer'.
}
]
];
COLexp $VAR1 = 'part';
如你所見,你實際上有一個嵌套陣列。所以你需要先訪問嵌套陣列,然后再訪問哈希值。
uj5u.com熱心網友回復:
下面的示例演示代碼提供了許多可能的方法之一,以形成OP命名的資料庫shema.
在函式addColumn($name, $type)中,OP沒有指定該列屬于哪個表。
最好能看到OP期望構建的最終資料結構,以明確最終結果是什么。
所提供的示例代碼希望能夠幫助OP找到解決他/她問題的方法。
輸出 注意:OP可以在Perl中對面向物件編程進行一些閱讀,這將允許把表的資料/結構封裝到一個物件中。結果代碼看起來會更干凈,更容易維護。
偽代碼的例子 uj5u.com熱心網友回復: 語法 所以現在 它試圖列印鍵 "1 "與值 uj5u.com熱心網友回復: 謝謝你的帖子,但它們都沒有解決實際問題。 解決辦法是 關鍵是要注意Ref陣列和陣列等之間的區別。 {$x}是解除參考的運算子。 我仍然沒有真正理解"%"等的真正作用。 我認為最好只使用參考,而完全避免%和@。
這個鏈接很有幫助
https://perldoc.perl.org/perlreftut
標籤:use strict;
use warnings;
use feature 'say';
使用 Data::Dumper。
my %tables;
tbAddColumn('grp','id','serial') 。
tbAddColumn('grp','part','integer') 。
tbAddColumn('tab2','foo2','varchar') 。
tbAddColumn('tab2','bar2','integer') 。
say Dumper(\%tables)。
my $tb_name = 'grp'/span>;
say "Table: $tb_name" ;
say '-'/span> x 45;
for my $column ( @{$tables{$tb_name}{columns}} ) {
say "name => $column->{name}, type => $column->{type}" ;
}
exit 0;
sub tbAddColumn{
my $tbname = shift;
my $name = shift;
my $type = shift;
push @{$tables{$tbname}{columns}}, { name => $name, type => $type};
}
$VAR1 = {
'tab2' => {
'columns' => [
{
'name' => 'foo2',
'type' => 'varchar'.
},
{
'name' => 'bar2',
'type' => 'intteger''grp' => {
'columns' => [
{
'name' => 'id',
'type' => 'serial'.
},
{
'type' => 'integer',
'name' => 'part'.
}
]
}
};
表:grp
---------------------------------------------
name => id, type => serial
name => part, type => integer
......
my $tb1 = new dbTable('grp') 。
my $tb2 = new dbTable('tab2') 。
$tb1->addColumn('id','serial') 。
$tb1->addColumn('part','integer') 。
$tb2->addColumn('foo2','varchar') 。
$tb2->addColumn('bar2','integer') 。
.....
%cols[1]是一個index-value陣列切片。如果@cols只有一個元素,那么索引1的值是未定義的,%cols[1]回傳串列(1, undef),該串列在你的第一個代碼段的第4行分配給%col:my %col = %cols[1] 。
%col = ("1" => undef),當你試圖在第5行列印它時:print "COLvar"/span>, %col, " ", "
"。
undef,這給出了一個警告,然后是輸出:在print中使用了未初始化的值。
COLvar 1
print "BIGexp"/span>, $tables{"grp"}[1]{_name}, "
"; # OK, part.
my $cols = $tables{"grp"}; # ref array
my $col = ${$cols}[1]; # ref hash
my %colh = %{$col}; # hash.
print "COLvar", $colh{_name}, " ", "
"; # bingo。
print "COLvar2", ${$col}{_name}, " , "
"; # bingo。
print "COL-> ", $col->{_name}, " ", "
"; # bingo。
