Ir para o conteúdo
Rui Carlos

[Perl] Fazer escape do backslash numa string

Mensagens Recomendadas

Rui Carlos    311
Rui Carlos

Numa script, tenho uma string (que corresponde a um caminho de um ficheiro), onde podem ocorrer backslashs.

O que eu queria fazer era substituir a ocorrências de \ por \\.

Por exemplo, passar de /abc/ab\ cd para /abc/ab\\ cd.

Para tal, tentei fazer $string =~ s/\\/\\\\/g; mas não funcionou... Alguém me sabe dizer como fazer isto?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pedrotuga    31
pedrotuga

Esse código está correcto e funciona B)

$mystring = "bla\\bla\\bloo\n";
print $mystring;

$mystring =~ s/\\/\\\\/g;
print $mystring;

O resultado foi este:

p@p-laptop:~$ perl teste.pl 
bla\bla\bloo
bla\\bla\\bloo
p@p-laptop:~$

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    311
Rui Carlos

O problema é que não é uma string assim que eu tenho  B)

As minhas strings, que correspondem aos argumentos provenientes da bash, só têm um \ de cada vez.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pedrotuga    31
pedrotuga

O problema é que não é uma string assim que eu tenho  B)

As minhas strings, que correspondem aos argumentos provenientes da bash, só têm um \ de cada vez.

as minhas tambem, ora olha para o output com atenção. A única razão pela qual vez duas na definição da string é porque eu tive que as escapar.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    311
Rui Carlos

Repara que mesmo na tua primeira string tu vês o \. No meu caso, quando eu imprimo a string, os \ nem são impressos (o print ignora os \ quando estes não representam uma sequência de escape).

Ou seja, eu recebo como argumento da linha de comandos o valor '/a/b\;c' que quando imprimo fica '/a/b;c' e eu precisava que ficasse '/a/b\;c'. Para isso, a string que o Perl tem internamente teria que passar a '/a/b\\;c', pois esta impressa já mostraria um \.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pedrotuga    31
pedrotuga

Ok, então o probleme está antes da substituição.

A tua string não tem os backslashes desde inicio.

Ora mostra aí como é que a estás a carregar. O escape de caracteres especiais não deve funcionar fora do contexto do interpretador. Ou seja, no meu caso, eu só tive que escapar os \, porqueinseri a string no meu código, que tem que ser perl válido. Se carregares uma string de uma stream por exemplo esta não tem que ter caracteres especiais escapados.

E daqui concluimos, que algures, a tua string está a ser parsada usando uma sintaxe qualquer que use o \ para escapar caracteres especiais.

Não podes por exemplo envia-la para um ficheiro em vez de mandares para o teu script?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    311
Rui Carlos

O que interessa da script é isto:

my $srcdir = $ARGV[0];
print length $srcdir;
print " |$srcdir|\n";

Se passarmos como argumento algo como '/abs/abc\;abc' o que imprime é '/abc/abc\;abc'.

É claro que eu podia passar como argumento o uma string já com duas barras, mas isso não era prático, pois quando usamos o TAB para completar uma path, ele só põe uma barra.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pedrotuga    31
pedrotuga

mas não estás a incluir as plicas como delimitadores do argumento... ou estás?

Se estiveres então a tua shell é diferente da minha.

Pelo menos para mim as strings são definidas sem problemas quer com aspas quer com plicas.

@srcdir = @ARGV;
$"="\n";
print "@srcdir\n\n

Output:

p@p-laptop:~$ perl teste.pl bananas\peras "bananas\peras" 'bananas\peras' bananas\\peras
bananasperas
bananas\peras
bananas\peras
bananas\peras

Se não funcionar tens uma solução: muda para uma shell à homem :D

Se o problema se prender com o facto de estares a usar um mac... boa sorte entao  :cheesygrin:

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    311
Rui Carlos

Não, na eu não passo as plicas na shell. Foi só para delimitar as strings.

Lá está, quando executas um comando na shell, normalmente, tens o primeiro caso: bananas\peras (ou bananas\ peras).

Aliás, quando no Perl faço if -d $srcdir com essa string funciona, mas se lhe passar a string bananas\\ peras já não encontra o directório.

Resumindo, vou precisar das duas versões da string. Uma com uma plica, e outra com duas.

EDIT:

Já consegui ultrapassar o problema.

Basicamente estava a usar uma string recebida da shell, e que representava um caminho de um directório, para construir um comando que depois ia executar com o system.

A solução foi na construção do comando colocar aspas à volta do caminho.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade