Dada uma string, eu quero
- defina todos os caracteres do 8º bit de
A
foI
(0x41
~0x49
para0xC1
~0xC9
). - redefinir todos os caracteres que possuem o 8º bit ativado para desativado.
Como,
$s='@ABCDEFGHIJKLMNOPQRS';
$s1= join "", map { $_ |= 0x80 if /A-I/ } split //, $s;
$s2= join "", map { $_ &= ~0x80 } split //, $s1;
Acho que meu código acima está próximo, mas não está funcionando totalmente.
Por favor ajude.
Seu código tem alguns problemas.
Primeiramente, a função para a qual você passa
map
deve retornar o valor desejado. Seu código está configurado$_
com o valor desejado (o que é bom, mas desnecessário), mas seu código$s1
não está retornando o resultado, então você acaba com uma string vazia. (Seu código$s2
retorna o resultado, então está tudo bem nesse aspecto, embora escrito de maneira um pouco estranha.)Em segundo lugar,
/A-I/
não é o regex certo. Você pretendia escrever/[A-I]/
.Terceiro, quando Perl converte entre strings e números (por exemplo, porque você chamou um operador bit a bit com uma string e um número), ele faz isso analisando a string em um número ou formatando o número na base 10. Por exemplo,
'3' | 12
é equivalente a3 | 12
, ou seja15
, que é convertido para,'15'
se necessário. Não é isso que você quer; em vez disso, você está interessado no valor ASCII/Unicode/byte dos caracteres na string. Para esse tipo de conversão, você precisa usarord
(caractere → número) echr
(número → caractere). Mas você não pode escreverchr(~0x80)
, porque~0x80
é0xFFFFFFFFFFFFFF7F
(assumindo um sistema de 64 bits), que não é um código de caracteres válido. Em vez disso, você precisa escreverchr(0x7F)
, ou"\x7F"
, ou então aplicar ochr
seguintea operação bit a bit, escrevendo, por exemplochr(ord($_) & ~0x80)
, .Então, juntando tudo, você pode escrever isto:
ou isto:
ou qualquer uma das várias outras permutações nesse sentido.
Solução super rápida: