2015-05-15 20 views
0

我真的很新的Perl和閱讀一些代碼後,我偶然發現了這種說法:Perl和Ruby的語法散列

my_hash{string}++ 

其中my_hash變量是一個Hash,字符串是任意字符串。

我的猜測是:

my_hash{string} = string++ 

和誰能這行代碼轉化爲Ruby的呢?

+1

'string ++'會嘗試增加字符串,例如:你認爲'apple ++'的價值是什麼? 'orange'? 'applf'? –

+2

@MarcB這將是Perl中的'applf'(假設操作是在標量上執行的)。我相信''蘋果「+ = 1'沒有在Ruby中定義,但''蘋果」.succ'也應該產生'applf' –

+0

@ThisSuitIsBlack不是真的,我編輯了我的評論,指出它必須在標量上執行。 –

回答

5
$var++; 

意味着

$var = $var + 1; 

,但它實際上更接近

$var = defined($var) ? $var+1 : 1; 

因爲LHS被視爲零(不含警告),如果它是不確定的。同樣,

$my_hash{key}++; 

相當於

$my_hash{key} = defined($my_hash{key}) ? $my_hash{key}+1 : 1; 

(有在極少數極端案例其它一些細微的差別,但沒有你關心。)


紅寶石相當於是

my_hash["key"] = my_hash["key"].to_i + 1; 

# If my_hash["key"] is a number, 
# Or if "my_hash" was created using "my_hash = Hash.new(0)". 
my_hash["key"] += 1; 

$ perl -E' 
    my %my_hash; 
    $my_hash{key}++; say $my_hash{key}; 
    $my_hash{key}++; say $my_hash{key}; 
' 
1 
2 

$ ruby -e' 
    my_hash = {}; 
    my_hash["key"] = my_hash["key"].to_i + 1; p my_hash["key"]; 
    my_hash["key"] = my_hash["key"].to_i + 1; p my_hash["key"]; 
' 
1 
2 

$ ruby -e' 
    my_hash = {}; 
    my_hash["key"] = 0; 
    my_hash["key"] += 1; p my_hash["key"]; 
    my_hash["key"] += 1; p my_hash["key"]; 
' 
1 
2 

$ ruby -e' 
    my_hash = Hash.new(0); 
    my_hash["key"] += 1; p my_hash["key"]; 
    my_hash["key"] += 1; p my_hash["key"]; 
' 
1 
2 
+1

首次讀取或寫入ruby代碼! – ikegami

+1

'my_hash [「key」] = my_hash [「key」] .to_i + 1'是一種替代方案('nil = to_i'爲0)。 – steenslag

+1

複製'nil'行爲的更清晰的方法是'my_hash = Hash.new(0)',當您第一次引用它的鍵時,默認值爲0。 –

1

my_hash{string}++被遞增存儲在哈希的整數,例如:

my %my_hash; 
$my_hash{hi} = 0; 
$my_hash{hi}++; 
print "$_ $my_hash{$_}\n" for (keys %my_hash); 
#> hi 1 

紅寶石散列被與[]訪問和Ruby不實現++,所以您必須使用+= 1。等價的Ruby代碼是:

my_hash = {} 
my_hash['hi'] = 0 
my_hash['hi'] += 1 
puts my_hash 
#> {"hi"=>1} 
+1

Perl和Ruby中的哈希值不一定是整數。 '++'和'+ = 1'也適用於浮點數。 – mob