На что действует оператор замены Perl?

Много проблем. То, о чем вы спрашиваете: Кристалл очень самоуверен в отношении дела. Методы должны начинаться со строчной буквы; ваш начинается с заглавных букв, что Crystal не нравится вообще. Некоторые другие проблемы:

  • {} of Int32 : Int32 должны использовать толстую стрелку, а не двоеточие: {} of Int32 => Int32

  • if утверждение не делает заканчивается двоеточием, это не Python.

  • Нет метода с именем key?; использование has_key?

  • fetch (в текущей версии Crystal) требует либо блока, либо второго аргумента, который задает значение по умолчанию; если вам не нужно указывать поведение по умолчанию (а вы не проверяете, существует ли ключ), вы можете просто использовать [].

Я действительно не уверен, для чего предназначен код, поэтому я не могу комментировать логику, семантику и стиль; но вот ваш код без синтаксических ошибок:

def twosum(a = [] of Int32, target = 0)
    map = {} of Int32 => Int32
    a.each_index do |i|
        diff = target - a[i]
        if map.has_key?(diff)
            return [map[diff], i]
        elsif
            map[a[i]] = i
        end
    end
    return 0
end

a = [1, 4, 6, 3]
target = 7
puts(twosum(a, target))
13
задан Leon Timmermans 7 December 2008 в 02:47
поделиться

3 ответа

Хм... ($lotr=$hobbit) =~ s/Bilbo/Frodo/g одно из многого волшебства Perl. Теперь для некоторых ответов.

Q1) $lotr присваивается значение, содержавшееся в $hobbit. После присвоения мы можем забыть об исходной переменной. Обработка ($lotr = $hobbit) как свой собственный оператор, как будто мы записали:

$lotr = $hobbit;
$lotr =~ s/Bilbo/Frodo/g;

вместо этого. regex воздействует на $lotr.

Q2), синтаксис является просто короткой версией отрывка, данного выше. Думайте о нем как о "копии строка от $a, скопируйте его в $b, и измените $b с regex" вместо "берут строку от $a, измените его с regex, результатом места в $b"

Q3) я предполагаю, что Вы имеете в виду пространство поиска шаблона по умолчанию "переменной значения по умолчанию цикла"? В этом случае просто используйте $_ вместо $hobbit:

while (<>) {
  chomp;
  ($lotr = $_) =~ s/Bilbo/Frodo/g;
  print "\$lotr = [$lotr]\n";
  print "\$_    = [$_]\n";
}

Интересно достаточно, волшебный var $_ не изменяется этой операцией. Это - то, как можно прийти к заключению, что присвоение происходит перед regex заменой и что замена не взаимодействует на пространстве шаблона по умолчанию всегда.

И для опытной вещи программистов Perl... Я не знаю слишком много людей, которые брошены некоторой частью синтаксиса Perl независимо от того, сколько времени они уставились на него 'cept г-н Schwartz, конечно, ;)

22
ответ дан 1 December 2019 в 20:58
поделиться

Различные языки делают разные вещи с оператором присваивания. В некоторых это - оператор, не выражение, так не может быть объединен в большее выражение. В некоторых это возвращает присвоенное значение, но только как значение (часто названный rvalue), не как что-то, что само может быть изменено или присвоено (lvalue). Примером этого является C, где можно записать:

 a = b = c;  # assign value of c to b and a

но нет:

 ++(b = a);  # assign value of a to b, then increment b

И в некоторых, результатом присвоения является lvalue, присвоенный. (В Perl это применяется только к скалярным присвоениям; присвоения списка являются более сложным зверем.), Таким образом, можно сделать ++ ($b=$a) или ($b=$a) = ~ s/a/b/или любая другая операция, которая ожидает lvalue на присвоении, и оно будет сначала делать уроки и затем далее изменять lvalue, присвоенный.

5
ответ дан 1 December 2019 в 20:58
поделиться

Если в Q2 Вы означаете брать подстроку от $a, Вы могли бы найти эту идиому полезной:

($b) = $a =~ /(substring-to-match)/;
$b =~ s/regex-on-susbtring/result-string/;

Также обратите внимание, что $a и $b не являются нормальными переменными в Perl, так как им связали специальные правила объема с функцией вида. См. 'perldoc perlvar' для деталей.

1
ответ дан 1 December 2019 в 20:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: