2015-05-15 20 views
0

Я действительно новичок в Perl и после прочтения какой-то код, я наткнулся на это заявление:Perl и Руби Hash синтаксис

my_hash{string}++ 

где переменная my_hash хэш, а строка произвольная строка.

Моя догадка:

my_hash{string} = string++ 

и может кто-нибудь перевести эту строку кода в Ruby, а?

+1

'string ++' будет пытаться увеличивать строку, например. как вы думаете, стоит ли «яблоко ++»? 'Orange'? 'Applf'? –

+2

@MarcB Это будет 'applf' в Perl (при условии, что операция выполняется на скаляре). Я считаю, что «яблоко» + = 1' не определено в Ruby, но «apple» .succ' также должно производить 'applf' –

+0

@ThisSuitIsBlackNot true, я отредактировал свой комментарий, чтобы указать, что он должен выполняться на скаляре. –

ответ

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

Первое чтение или запись рубинового кода! – 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 

Рубин хэши доступ с [], и Руби не реализует ++, так вы должны использовать += 1. Тогда эквивалентный код Ruby:

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

Значение хэша в Perl и Ruby не обязательно должно быть целым числом. '++' и '+ = 1' работают с числами с плавающей запятой. – mob

Смежные вопросы