Entender como as strings funcionam é importante em toda linguagem de programação, mas em Perl elas são parte da essência da linguagem. Especialmente se você considerar que um dos acrônimos do Perl é Practical Extraction and Reporting Language e para isso você precisa usar muitas strings.
Strings podem ser colocadas dentro de aspas simples '
ou duplas
"
e elas tem um comportamento ligeiramente diferente.
Strings com aspas simples
Se você coloca caracteres entre aspas simples '
, então quase todos os
caracteres, exceto a aspa simples '
e a contra-barra \
, o
caractere de escape, são interpretados como são escritos no código.
my $name = 'Foo';
print 'Hello $name, how are you?\n';
A saída será:
Hello $name, how are you?\n
Strings com aspas duplas
Strings colocadas entre aspas duplas "
provêm interpolação (outras
variáveis embutidas na string serão substituídas pelo seu conteúdo), e elas
também substituem os caracteres escapados especiais, tais como \n
por
uma quebra de linha e \t
por uma tabulação.
my $name = 'Foo';
my $time = "today";
print "Hello $name,\nhow are you $time?\n";
A saída será:
Hello Foo,
how are you today?
Nota, há um \n
logo depois da vírgula e outro ao final da string.
Para strings simples tais como 'Foo' e "today" que não possuem os caracteres
$
, @
, e \
, não faz diferença se forem colocadas
entre aspas duplas ou simples.
As duas linhas seguintas tem exatamente o mesmo resultado:
$name = 'Foo';
$name = "Foo";
Endereços de Correio Eletrônico
Como @
também interpola entre aspas duplas, escrever endereços de
correio eletrônico precisam de um pouco mais atenção.
Em aspas simples @
não interpola.
Em aspas duplas esse código gera um erro: Global symbol "@bar" requires explicit package name at ... line ...
e um alerta: Possible unintended interpolation of @bar in string at ... line ...
Este último pode ser aquele que nos dá a melhor pista do que está realmente acontecendo.
use strict;
use warnings;
my $broken_email = "foo@bar.com";
Esse código, por outro lado, tendo o endereço de correio eletrônico entre aspas simples, vai funcionar.
use strict;
use warnings;
my $good_email = 'foo@bar.com';
E se você precisar de ambos interpolações de variáveis escalares e quiser
incluir arrobas @
na string?
use strict;
use warnings;
my $name = 'foo';
my $good_email = "$name\@bar.com";
print $good_email; # foo@bar.com
Você sempre pode escapar os caracteres especiais, neste caso a arroba
@
, usando o chamado caractere de escape que é a contra-barra
\
.
Embutindo o cifrão $ em strings com aspas duplas
Do mesmo jeito se você quiser incluir um sinal $
em uma string com
aspas duplas, você pode escapa-lo também:
use strict;
use warnings;
my $name = 'foo';
print "\$name = $name\n";
Vai imprimir:
$name = foo
Escapando o escape
Existem casos onde você gostaria de incluir o escape na string. Se você
colocar uma contra-barra \
em uma string, (seja ela com aspas simples
ou duplas), o Perl vai pensar que você quer escapar o próximo caractere e
fazer sua mágica.
Não se preocupe. Você pode dizer ao Perl para parar isso escapando o caractere de escape:
Simplesmente coloque mais um escape antes dele:
use strict;
use warnings;
my $name = 'foo';
print "\\$name\n";:w
\foo
Entendo que escapar um escape é um pouco estranho, mas isto é basicamente como a coisa funciona em todas as outras linguagens também.
Se você quiser entender como funciona esse esquema de escapes, tente algo como:
print "\\\\n\n\\n\n";
veja o que é impresso:
\\n
\n
e tente explicar para si mesmo.
Escapando aspas duplas
Vimos que você pode colocar variáveis escalares em strings envoltas por aspas
duplas e pode também escapar o sinal $
.
Vimos que você pode usar o escape \
e como pode escapa-lo também.
E se você quiser imprimir uma aspa dupla dentro de uma string envolta por aspas duplas?
Este código tem um erro de sintaxe:
use strict;
use warnings;
my $name = 'foo';
print "The "name" is "$name"\n";
Quando o Perl ve aspas duplas logo antes da palavra "name" ele pensa que este foi o final da string e então ele reclama que a palavra name é uma palavra solta.
Você já deve ter conjecturado, é preciso escapar as aspas duplas "
ali embutidas:
use strict;
use warnings;
my $name = 'foo';
print "The \"name\" is \"$name\"\n";
Isto vai imprimir:
The "name" is "foo"
Funciona, mas é um tanto difícil de ler.
qq, o operator duplo-q
Aqui é onde você pode usar o qq
, ou o operador duplo-q:
use strict;
use warnings;
my $name = 'foo';
print qq(The "name" is "$name"\n);
Para olhos não treinados, o qq() pode parecer uma chamada de função, mas não
é. qq
é outro operador e você verá em um segundo o que mais ele pode
fazer, mas antes deixe-me explicar.
Trocamos as aspas duplas "
que costumavam envolver a string pelos
parêntesis do qq
. Isso significa que as aspas duplas não são mais
especiais na string, e não é mais necessário escapá-las.
Isso faz o código ficar mais legível.
Até poderia dizer que ficou mais bonito, se eu não temesse a ira dos
programadores Python.
Mas e se você quisesse incluir os parêntesis na sua string?
use strict;
use warnings;
my $name = 'foo';
print qq(The (name) is "$name"\n);
Sem problemas, contanto que eles estejam pareados (ou seja, ter a mesma
quantidade de parêntesis abertos (
e fechados )
, e sempre
ter um parentesis aberto (
antes de seu correspondente fechado
)
) o Perl pode entender.
Eu sei. Você vai querer fechar parêntesis antes de abrir, só para quebrar a regra:
use strict;
use warnings;
my $name = 'foo';
print qq(The )name( is "$name"\n);
De fato, o Perl lhe dará um erro de sintaxe sobre "name" ser umapalavra solta. O Perl não pode entender tudo, pode?
Claro que é possível escapar os parêntesis dentro da string \)
e
\(
, mas já descemos nessa toca de coelho.
Não, obrigado!
Deve haver um caminho melhor.
Lembra que escrevi que o qq
é um operador e não uma função? Então ele
pode fazer truques, certo?
E se trocarmos os parêntesis que envolvem a string por chaves? {}
:
use strict;
use warnings;
my $name = 'foo';
print qq{The )name( is "$name"\n};
Funciona e imprime a string que queríamos:
The )name( is "foo"
(contudo, não sei porquê eu iria querer imprimir uma coisa desse tipo...)
Então o cara da segunda fila levanta a mão e pergunta: "E se você quiser parêntesis e chaves na sua string, ambos descasados? (link em inglês)
Você quer dizer assim, certo?
use strict;
use warnings;
my $name = 'foo';
print qq[The )name} is "$name"\n];
imprime isto:
The )name} is "foo"
... deve haver uma forma de utilizar os colchetes também, certo?
q, o operator q-único
Semelhante ao qq
existe também um operador chamado q
. Ele
também permite que você selecione os delimitadores da sua string, mas isso
funciona como uma aspa simples '
funciona: SEM interpolação de
variáveis.
use strict;
use warnings;
print q[The )name} is "$name"\n];
imprime:
The )name} is "$name"\n