2013-12-11 34 views
1

我遇到了Perl問題。這給了我一個我不明白的錯誤。如何使用Perl全局散列

這是我的計劃

our $neighbor = {}; 

$$neighbor{'a'} = 'b'; 

print Dumper($vizinho); 

sub keyboard{ 
    my ($a,$b) = @_; 
    return 4 if ($a eq $b); 
    return 2 if $neighbor{$a}{$b}; 
    return -1; 
} 

而且我的錯誤是

Variable "%vizinho" is not imported at t/DistStr.t line 30. 
Global symbol "%vizinho" requires explicit package name at t/DistStr.t line 30. 
Execution of t/DistStr.t aborted due to compilation errors. 
# Looks like your test exited with 255 just after 1. 

我想要做的就是

use Alinhamento; 

$neighbor = ... # Something which will create an hash where 
       # $neighbor{$x}{$y} exists if the letter $x is neighbour of $y 

sub keyboard { 
    my ($a, $b) = @_; 
    return 4 if ($a eq $b); 
    return 2 if $neighbor{$a}{$b}; #And use that $neighbor on that function 
    return -1; 
} 

但我不知道如何使。請給我一些建議嗎?

回答

4

有很多方法,具體取決於上下文中不明顯的細節。這裏是鬆散的基礎上您的原始張貼一個簡單的方法:

use Data::Dumper; 

our %neighbor; 

$neighbor{'a'}{'b'} = 1; 

print Dumper(\%neighbor); 

sub keyboard{ 
    my ($a, $b) = @_; 
    return 4 if ($a eq $b); 
    return 2 if $neighbor{$a}{$b}; 
    return -1; 
} 

編輯:重命名$vizinho%neighbor。謝謝@Borodin。

注意$a$b在Perl中有點特別。請參閱documentation for sort

+2

* vizinho *是葡萄牙語*鄰居* – Borodin

+0

啊,所以它從來沒有被認爲是一個哈希引用!好電話 – Borodin

3

您必須啓動 Perl程序與

use strict; 
use warnings; 

很多問題會自行解決。

以與其他變量相同的方式使用包(全局)變量。其實如果你已經習慣了而不是使用的是strict,那麼所有的你的變量都可能是包變量。


更新

要設置元素x,你的哈希的Ÿ使其存在,你應該寫

$vizinho->{$x}{$y} = 1; 

你的問題似乎與如何使用引用。您聲明

our $vizinho = {} 

,然後嘗試使用

$$vizinho{'a'} = 'b' 

這是錯誤的,分配給它。你可以寫

${$vizinho}{'a'} = 'b' 

,或者更好的

$vizinho->{a} = 'b' 

你也不要永遠使用$a$b。您的代碼應該是這樣的

use strict; 
use warnings; 

our $vizinho = {}; 

$vizinho->{a} = 'b'; 

sub keyboard { 
    my ($meu_a, $meu_b) = @_; 
    return 4 if $meu_a eq $meu_b; 
    return 2 if $vizinho->{$meu_a} eq $meu_b; 
    return -1; 
} 
+0

'$$ vizinho {'a'} ='b''是正確的,相當於'$ vizinho - > {a} ='b'',儘管我不鼓勵第一種形式。 – amon

1

通過以下線路創建一個標量的哈希參考:

our $neighbor = {}; 

我懷疑你想要的只是一個哈希

our %neighbor = (
    'foo' => { 
     'bar' => 1, 
    }, 
    'biz' => { 
     'baz' => 1, 
    }, 
); 

sub keyboard { 
    my ($key1, $key2) = @_; 
    return 4 if ($key1 eq $key2); 
    return 2 if $neighbor{$key1}{$key2}; #And use that $neighbor on that function 
    return -1; 
} 

而且請注意,$ a和$ b是perl的排序函數使用的特殊變量,因此爲了清晰起見,最好使用另一個變量名稱。

+0

你是對的,我在設置示例數據結構時很粗心。 Tiz現在修好了。謝謝 – Miller