2012-08-27 52 views
1

我能夠使用此代碼訪問一個Perl 2×2陣列

#!/usr/bin/perl -w 

@arr1 = (10,20,30); 
@arr2 = (10,20,30); 
@arr3 = (10,20,30); 
@ref_arr = (\@arr1, \@arr2, \@arr3); 

print"Prog starts\n";   

foreach $ref (@ref_arr) { 
    #print @$ref->[0]; 
    foreach $val (@$ref) { 
    print "$val "; 
    } 
    print"\n"; 
} 

使用map函數I可以在這樣

實施例的矩陣修改每個值以產生矩陣的單個元素:增加1

foreach $ref (@ref_arr) { 
    map($_++, @$ref); 
} 

,但我想每個值修改某一行或一個特定的值,即要麼加1所有的第二行的值或的SE的第一列cond row

+0

一起遞增另外,請查閱http://perldoc.perl.org/perllol.html以獲取更多的好例子。 – EMiller

+0

@謝謝你的鏈接:)這真的是一個很好:) – Maverick

回答

2

您必須總是use strictuse warnings的頂部每程序,你寫。這尤其適用,如果你要求你的代碼的幫助,因爲這些措施將顯示簡單的錯誤,否則你將忽略

map功能用於遍歷一個列表:它是「映射」一個列表另一個應用的功能,信號源列表

的每個元素當你寫

map($_++,@$ref) 

你正在構建和@list丟棄值的副本。你應該寫的是

$_++ for @$ref 

至於如何修改一個值從數組中,您的數組初始化可以簡化爲

my @data = (
    [10, 20, 30], 
    [10, 20, 30], 
    [10, 20, 30] 
) 

我從這個希望很容易地看到,結構中的第一個10可作爲$data[0][0]訪問,並且最後的20$data[2][1](記住Perl數組的索引從零開始)。您可以訪問和修改這些值,就像任何普通標量一樣

至於您的特定示例,第二行是@{$data[1]},因此您可以通過編寫$_++ for @{$data[1]}來增加行的每個元素。第二行的第一列與$data[1][0]++

+0

「你在建設和丟棄」這是否仍然如此?我讀過最近的perls不會在無效的情況下建立這個列表。 – choroba

+0

否。「map」的內部功能已被修改,因此它不會無用地構建並放棄已在void上下文中調用的數組。但電話仍在要求完成,依靠Perl的仁慈是錯誤的。的確,正確使用'map'應該有* no *副作用 - 即塊不應該改變,也不會改變IO:它應該只返回一個(列表)值 – Borodin

3

您使用的是row x columncolumn x row?我會承擔第一。

要在$x, $y修改值:

$ref_arr[$x][$y] = $new_value; 

添加1〜$x柱:

$_++ for @{ $ref_arr[$x] }; 

要加1行$y

$_->[$y]++ for @ref_arr;