• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Rui Carlos

[Perl] Fazer escape do backslash numa string

9 mensagens neste tópico

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?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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:~$

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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 \.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

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