Pergunta

Eu tenho sido programação em Perl, e desligando, há anos, embora apenas esporadicamente é minha língua primária. Porque eu muitas vezes passam meses sem escrever qualquer perl, Eu confio muito no meu orelhudo-dog Camel livro para lembrar-me como fazer as coisas. No entanto, quando eu copiar receitas Verbatim com nenhuma compreensão, este me incomoda. Este é um dos mais irritante: Na página 154 da 3ª edição do camelo, há um exemplo de "cordas modificando en passant , que lê como este:

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

Q1) o que está acontecendo aqui? Em que, exatamente, é o operacional regex?

Q2) É esta sintaxe quase mágica necessária para uma operação tão básico como "ter uma string de $ a, modificá-lo com um regex, resultado lugar no $ b"?

Q3) Como eu faço esta operação usando a variável do laço padrão como a seqüência inicial?

Desculpas antecipadamente para sonhadores Perl para quem os olhares acima perfeitamente natural.

Foi útil?

Solução

Hmmm ... ($lotr=$hobbit) =~ s/Bilbo/Frodo/g é uma das muitas magias de Perl. Agora, para algumas respostas.

Q1) $lotr está sendo atribuído o valor contido na $hobbit. Após a atribuição, podemos esquecer a variável de origem. ($lotr = $hobbit) Tratar como a sua própria afirmação como-se tivéssemos escrito:

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

em seu lugar. A regex está operando em $lotr.

Q2) A sintaxe é simplesmente uma versão de uma linha do trecho dado acima. Pense nisso como "copiar a cadeia de $a, copiá-lo para $b e modificar $b com a regex" em vez de "ter uma string de $a, modificá-lo com um regex, resultado lugar na $b"

Q3) Eu estou supondo que você quer dizer o espaço de busca padrão predefinido por "variável padrão laço"? Nesse caso, basta usar $_ vez de $hobbit:

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

Curiosamente, a $_ mágica var não é modificado por esta operação. Isto é como você pode concluir que a atribuição acontece antes a substituição regex e que a substituição não interage com o espaço padrão de padrão de qualquer forma.

E para o experiente coisa programadores Perl ... Eu não conheço muitas pessoas que são jogados por algum pedaço de Perl sintaxe independentemente de quanto tempo eles têm sido olhando para ele 'CEPT Mr. Schwartz é claro;)

Outras dicas

As línguas diferentes fazem coisas diferentes com o operador de atribuição. Em alguns, é uma indicação, não uma expressão, assim não podem ser combinadas em uma expressão maior. Em alguns, ele retorna o valor atribuído, mas apenas como um valor (muitas vezes chamado de um rvalue), não como algo que em si pode ser modificado ou atribuído (um lvalue). Um exemplo disso é C, onde você pode escrever:

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

, mas não:

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

E, em alguns, o resultado de uma atribuição é o lvalue atribuído. (Em Perl, este aplica-se apenas às atribuições escalares;. Atribuições da lista são uma besta mais complexo) Então você pode fazer ++ ($ b = $ a) ou ($ b = $ a) = ~ s / a / b / ou qualquer outra operação que espera um lvalue na atribuição, e vai primeiro fazer a tarefa e, em seguida, modificar ainda mais o lvalue atribuído.

Se no Q2 você quer dizer para tomar um sub-string a partir de $ a, você pode encontrar este idioma útil:

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

Também fazer notar que $ a e $ b não são variáveis ??normais em Perl uma vez que eles têm regras especiais de escopo relacionados com a função de classificação. Veja 'perlvar perldoc' para obter detalhes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top