thegoodfellas/blogset-br huggingface dataset:
o arquivo atraves de um programa de FTP (CuteFTP ou WS_FTP), e importante que seja usado o modo de transferencia ASCII, e nunca Binario. O programa deve ser salvo com a extensao .cgi (que indica ser um script) ou com .pl (de Perl), e depois torna-lo executavel. Pelo Unix, digite: chmod u+x programa na linha de comandos, onde programa e o nome do seu arquivo. Pelo FTP, clique em alterar atributos do arquivo, escolhendo o valor 755 (-rwxr-xr-x). Agora rode o programa apenas digitando um destes comandos: perl programa (pelo DOS ou UNIX) ./programa (pelo UNIX) programa (pelo DOS) Caso voce esteja usando a linha de comandos do DOS, e necessario ter o programa Perl for Win32 instalado, ele pode ser retirado no endereco: http://www.activestate.com/ Se algo ocorrer de errado, podem aparecer mensagens de erro, ou nada. Voce pode sempre rodar o programa com mensagens atraves do comando: perl -w programa Ele mostrara avisos e outras mensagens de ajuda antes de tentar executar o programa. Para roda-lo com a depuracao, use o comando: perl -d programa O Perl compila primeiro o programa e entao executa sua versao compilada. Assim, apos uma pequena pausa para compilacao, o programa deve rodar rapidamente. Certifique-se de que o programa esta funcionando antes de continuar. Variaveis escalares O tipo mais usado de variavel no Perl e o escalar. Variaveis escalares podem conter caracteres e/ou numeros, e note que eles sao completamente intercambiaveis. Por exemplo, a declaracao: $prioridade = 9; atribui a variavel escalar $prioridade o valor 9, mas voce pode tambem designar uma string (cadeia de caracteres) para a mesma variavel: $prioridade = 'alta'; Perl tambem aceita numeros como strings: $prioridade = '9'; $default = '0009'; e ainda pode realizar operacoes aritmeticas ou outras. Em geral, nomes de variaveis consistem de numeros, letras e simbolos _ mas nao devem comecar com numeros depois do $. A variavel $_ e especial, como veremos mais tarde. Alem disso, o Perl e case sensitive, i.e, letras maiusculas sao diferentes de minusculas, por exemplo, $a e $A sao variaveis distintas. Operacoes e Atribuicoes Interpletacao Exercicio Operacoes e Atribuicoes O Perl utiliza todas as operacoes usuais na linguagem C: $a = 1 + 2; # soma 1 e 2 e armazena em $a$a = 3 - 4; # subtrai 4 de 3 e armazena em $a$a = 5 * 6; # multiplica 5 por 6$a = 7 / 8; # divide 7 por 8 e retorna 0.875$a = 9 ** 10; # 9 elevado por 10$a = 5 % 2; # resto da divisao de 5 por 2++$a; # incrementa $a e retorna seu valor$a++; # retorna $a e depois incrementa em 1--$a; # decrementa $a e retorna seu valor$a--; # retorna $a e depois decrementa em 1 e para caracteres, existem os seguintes operadores: $a = $b . $c; # concatena $b e $c$a = $b x $c; # $b repetido $c vezes Para atribuir valores, Perl utiliza: $a = $b; # atribui $b para $a$a += $b; # soma $b para $a$a -= $b; # subtrai $b de $a$a .=
$b; # acrescenta $b em $a Note que quando Perl atribui um valor como $a = $b, ele faz uma copia de $b e entao o atribui para $a. Portanto, na proxima vez que voce alterar $b, ele nao ira alterar $a. Outras operacoes podem ser encontradas atraves do comando man perlop na linha de comandos do Unix. Interpletacao O seguinte codigo mostra macas e peras usando concatenacao: $a = 'macas';$b = 'peras';print $a.' e '.$b; Seria mais facil incluir somente uma string no final da declaracao print, mas a linha: print '$a e $b'; mostra somente $a e $b, e nao macas e peras, o que nao e o nosso caso. Ao inves disso, podemos usar aspas duplas no lugar de aspas simples: print "$a e $b"; Estas aspas forcam a interpolacao de qualquer codigo, incluindo interpretacao de variaveis. Isso e mais apropriado que nossa declaracao original. Outros codigos que sao interpolados incluem caracteres como newline e tab. O codigo \n e o newline (enter/return) e \t e o tab. Outros exemplos que produzem o mesmo resultado: print ' Meu e-mail e nome@dominio.com '."\n";print " Meu e-mail e nome\@dominio.com \n"; Note que, com aspas duplas, se faz necessario o uso da barra invertida antes do @, porque senao ele sera interpretado como sendo uma variavel, que veremos adiante. Exercicios Neste exercicio voce deve reescrever seu primeiro programa de modo que (1) a string seja atribuida para uma variavel e (2) esta variavel seja impressa com um caractere newline. Use as aspas duplas e nao utilize o operador de concatenacao. Certifique-se de que o programa funciona, antes de prosseguir. Variaveis de matrizes Um tipo mais interessante de variavel e o de matrizes (vetores) que e uma lista de variaveis escalares. Variaveis de matrizes tem o mesmo formato das escalares exceto que eles sao prefixados pelo simbolo @. As declaracoes: @comida = ("macas", "peras", "uvas");@musica = ("flauta", "gaita"); atribuem tres elementos para a matriz @comida e dois para a matriz @musica. A matriz e acessada pelo uso de indices comecando do zero, e colchetes sao usados para especificar cada indice. A expressao: $comida[2] retorna uvas. Note que o simbolo @ foi mudado para $ porque uvas e o valor de uma variavel escalar. Atribuicoes de matrizes Mostrando matrizes Exercicio No Perl, a mesma expressao em um contexto diferente pode produzir um resultado diferente. A primeira atribuicao abaixo expande a variavel @musica de modo que fique equivalente a segunda atribuicao: @mais_musica = ("orgao", @musica, "harpa"); @mais_musica = ("orgao", "flauta", "gaita", "harpa"); Isto deve sugerir um modo de acrescentar elementos em uma matriz. Um modo simples de acrescentar estes elementos e usar a declaracao: push(@comida, "ovos"); que acrescenta ovos ao fim da matriz @comida. Para acrescentar dois ou mais itens, use um dos seguintes formatos: push(@comida, "ovos", "carne"); push(@comida, ("ovos", "carne")); push(@comida, @mais_comida); Alem disso, a funcao push retorna o comprimento da nova lista. Para remover o ultimo item de uma lista e retorna-lo, use a funcao pop. De nossa primeira lista, a funcao pop retorna uvas e @comida passa a ter dois elementos: $outra_comida
= pop(@comida);# agora $outra_comida = "uvas" Tambem e possivel atribuir uma matriz para uma variavel escalar. A linha: $c = @comida; atribui apenas o comprimento de @comida, mas $c = "@comida"; transforma a lista em uma string com um espaco entre cada elemento. Este espaco pode ser substituido por qualquer outro caractere apenas mudando o valor da variavel especial $" (por exemplo, $" = " mais ";). Esta variavel e apenas uma de muitas outras usadas na linguagem Perl. Matrizes tambem podem ser usadas para fazer multiplas atribuicoes para variaveis escalares: ($a, $b) = ($c, $d); # e o mesmo que $a=$c; $b=$d; ($a, $b) = @comida; # $a e $b sao os primeiros itens de @comida. ($a, @alguma_comida) = @comida; # $a e o primeiro item de @comida e @alguma_comida e uma lista dos # demais elementos. (@alguma_comida, $a) = @comida; # @alguma_comida = @comida e $a e indefinida. A ultima atribuicao ocorre desta maneira porque matrizes consomem tudo, e @alguma_comida retira todos os elementos de @comida. Portanto, este formato deve ser evitado. Finalmente, voce pode querer encontrar o indice do ultimo elemento de uma lista. Para fazer isso, use a expressao: $#comida Copyright 1999 STI Internet. Todos os direitos reservados. Mostrando matrizes Desde que contexto e importante, nao e surpresa que os seguintes comandos produzem resultados diferentes: print @comida; # resultado obvioprint "@comida"; # tratado como stringprint @comida.""; # em um contexto escalar Exercicios Experimente cada uma das tres declaracoes citadas em "Mostrando matrizes" para ver o que elas fazem. Manipulando arquivos Aqui esta um programa basico em Perl que faz o mesmo que o comando cat do Unix em um certo arquivo: #!/usr/local/bin/perl # # Programa para abrir o arquivo de senhas, ler, # escrever, e fecha-lo. $arquivo = '/etc/passwd'; # nome do arquivo open(INFO, $arquivo); # abre o arquivo @linhas = ; # coloca ele em uma matriz close(INFO); # fecha o arquivo print @linhas; # exibe a matriz A funcao open abre um arquivo para entrada (i.e, para leitura). O primeiro parametro e o nome que permite ao Perl referir o arquivo futuramente. O segundo parametro e a expressao denotando o nome do arquivo com sua localizacao. Se o nome do arquivo for escrito entre aspas, entao ele e tomado literalmente sem a expansao shell do Unix. Assim, a expressao '~/etc/passwd' nao sera interpretada com sucesso. Se voce deseja forcar a expansao shell, entao use os simbolos < e >, neste caso, <~/etc/passwd>. A funcao close diz ao Perl para fechar o arquivo. Existem poucos pontos para acrescentar sobre a manipulacao de arquivos. Primeiro, a declaracao open pode tambem especificar um arquivo para saida ou para acrescimo, assim como para entrada. Para fazer isso, use o simbolo > para saida e >> para acrescimos: open(INFO, $arquivo); # abre para leitura open(INFO, ">$arquivo"); # abre para escrita open(INFO, ">>$arquivo"); # permite acrescentar open(INFO, "<$arquivo"); # tambem abre para leitura Segundo, se voce quiser gravar alguma informacao em um arquivo, voce deve abri-lo para escrita e entao pode usar a declaracao print com um parametro extra. Para gravar uma
string no arquivo INFO use: print INFO "Esta linha vai para o arquivo.\n"; Terceiro, voce pode usar o seguinte comando para abrir a entrada padrao (usualmente o teclado) e a saida padrao (usualmente a tela) respectivamente: open(INFO, '-'); # abre entrada padrao open(INFO, '>-'); # abre saida padrao No programa acima, a informacao e lida do arquivo. O arquivo chama-se INFO e para ler ele atraves do Perl, coloque entre os simbolos < e >. Assim, a declaracao: @linhas = ; le o arquivo denotado por INFO e coloca dentro da matriz @linhas. Note que a expressao le o arquivo inteiro em apenas um passo. Isto ocorre porque a leitura e tratada como uma variavel de matriz. Se @linhas fosse substituida por uma variavel escalar $linhas, entao somente a primeira linha seria lida (e depois as proximas). Em ambos casos, cada linha e armazenada completamente com seu caractere newline no final. Exercicio Exercicio #!/usr/local/bin/perl # # Programa para abrir o arquivo de senhas, ler, # escrever, e fecha-lo. $arquivo = '/etc/passwd'; # nome do arquivo open(INFO, $arquivo); # abre o arquivo @linhas = ; # coloca ele em uma matriz close(INFO); # fecha o arquivo print @linhas; # exibe a matriz Modifique o programa acima de modo que todo o arquivo contenha o simbolo # no inicio de cada linha. Voce devera somente acrescentar uma linha e modificar uma delas. Use a variavel $". Coisas inesperadas podem ocorrer com arquivos, entao voce pode encontrar alguma ajuda com o uso da opcao w, como mencionado no topico Executando o programa. Estruturas de controle Possibilidades mais interessantes aparecem quando nos introduzimos as estruturas de controle e o looping. Perl suporta muitos tipos diferentes de estruturas de controle que tendem a ser como na linguagem C, mas muitos sao similares aos do Pascal, tambem. Aqui discutiremos um pouco delas. foreach Testando for while e until Exercicio foreach Para executar cada linha de uma matriz ou de outra estrutura com formato de lista (como linhas em um arquivo), Perl usa a estrutura foreach. Ela tem o seguinte formato: foreach $petisco (@comida) # visitar cada item e coloca-lo em $petisco{print "$petisco\n"; # exibe cada itemprint "Yum yum\n"; # de @comida...} As acoes a serem realizadas cada vez, estao no bloco entre chaves. Na primeira passagem pelo bloco, $petisco e atribuido ao valor do primeiro item da matriz @comida. Na proxima vez, ele e atribuido ao segundo valor, e assim por diante. Se @comida estiver vazio logo no inicio, entao o bloco de declaracoes nao sera executado. Testando As proximas e poucas estruturas contam com os testes booleanos verdadeiro ou falso. O numero zero, sendo zero um caractere, e o caractere vazio ("") sao contados como falsos. Aqui estao alguns testes em numeros e strings: $a == $b # $a e numericamente igual a $b? cuidado: nao use so o operador = $a != $b $a e numericamente diferente de $b? $a eq $b # $a e uma string igual a $b?$a ne $b # $a e uma string diferente de $b? Voce pode tambem tentar usar operadores
logicos e, ou, nao: ($a && $b) # $a e $b sao verdadeiros?($a || $b) # $a ou $b e verdadeiro?!($a) # $a e falso? for Perl possui a estrutura for que funciona da mesma forma que no C. Ele tem o formato: for (inicializar; testar; incrementar){primeira_acao;segunda_acao;etc;} Primeiramente, a declaracao inicializar e executada. Entao, enquanto testar for verdadeiro, o bloco de acoes sera executado. Apos cada passagem, e a vez de incrementar. Aqui esta um exemplo de loop para mostrar os numeros de 0 a 9: for ($i = 0; $i < 10; ++$i)# comeca com $i = 0# executa enquanto $i < 10# incrementa $i antes de repetir# neste caso $i++ tem o mesmo efeito{print "$i\n";} while e until Aqui esta um programa que le do teclado e nao continua ate que a senha correta seja digitada: #!/usr/local/bin/perlprint "Senha? "; # pede pela senha$a = ; # le do tecladochop $a; # remove o newline no final da linhawhile ($a ne "teste") # enquanto a senha estiver errada...{print " errada.\n Senha? "; # solicita novamente$a = ; # le do tecladochop $a; # remove o caractere newline no final} O bloco de codigo entre chaves e executado enquanto a entrada nao for igual a senha. A estrutura while deve ser de facil compreensao, mas e oportuno notar diversos detalhes. Primeiro, nos podemos ler de uma entrada padrao (teclado) sem precisar abri-la. Segundo, quando a senha e digitada, $a inclui o caractere newline no final (ao pressionar enter/return). A funcao chop remove o ultimo caractere de uma string que neste caso e o newline. Para testar o oposto, nos podemos usar a declaracao until do mesmo modo. Este executa o bloco repetidamente ate que a expressao seja verdadeira, e nao enquanto ela e verdadeira. Outra tecnica util, e colocar o while ou until no final do bloco de declaracoes, em vez de colocar no inicio. Isto requer a presenca do operador do para marcar o inicio do bloco e o teste no final. Novamente, o programa acima pode entao ser escrito desta forma (note que o bloco sera executado pelo menos uma vez): #!/usr/local/bin/perldo{print "Senha? "; # pede pela senha$a = ; # le do tecladochop $a; # remove o ultimo caractere, newline}while ($a ne "teste");# repete enquanto a senha for errada# usando until no lugar de while,# until ($a eq "teste"); repete ate que a senha esteja correta Exercicio Modifique o programa do exercicio anterior de modo que cada linha do arquivo seja lida uma a uma, e retorne com um numero de linha no inicio. Voce deve ter algo como: 1 root:oYpYXm/qRO6N2:0:0:Super-User:/:/bin/csh2 sysadm:*:0:0:System V Administration:/usr/admin:/bin/shdiag:*:0:996:Hardware Diagnostics:/usr/diags:/bin/csh3 etc Talvez seja interessante usar esta estrutura: while ($linha = ) # le cada linha ate o final de INFO{...} Quando voce tiver feito isso, veja se pode altera-lo de modo que cada numero de linha seja mostrada como 001, 002, ..., 009, 010, 011, 012, etc. Para fazer isso, voce devera somente mudar uma linha inserindo quatro caracteres extras. Lembre-se que o Perl permite isso. Condicionais E claro que o Perl tambem permite
testes condicionais if/then/else. Eles possuem o seguinte formato: if ($a) { print "A variavel nao esta vazia\n"; } else { print "A variavel esta vazia\n"; } Para entender, recorde que o caractere vazio e considerado como falso. Ele tambem retorna falso se o caractere for zero. Tambem e possivel incluir mais alternativas em uma declaracao condicional: if (!$a) # ! e o operador nao { print "A variavel esta vazia\n"; } elsif (length($a) == 1) # se acima falir, tente isso { print "A variavel tem um caractere\n"; } else # se tambem falir... { print "A variavel tem varios caracteres\n"; } Neste caso, e importante notar que a declaracao elsif esta correta, sem o e de elseif. Exercicio Exercicio Encontre um arquivo grande com algum texto e algumas linhas em branco. Do exercicio anterior, voce deve ter um programa que mostra o arquivo de senhas com numeros de linhas. Mude ele de modo que funcione com o outro arquivo de texto. Agora altere o programa de modo que aqueles numeros nao sejam mostrados ou contados com linhas em branco, mas toda linha permanece sendo mostrada, incluindo as em branco. Recorde que, quando uma linha do arquivo e lida, ela continua incluindo seu caractere newline no final. Comparando strings Um dos mais uteis recursos do Perl (senao o mais util) e a poderosa manipulacao de strings. No coracao desta, esta a expressao regular (ER) que e compartilhada por muitos outros utilitarios do Unix. Expressoes regulares A variavel especial $_ Mais sobre ERs Alguns exemplos de ERs Exercicio Expressoes regulares Uma expressao regular sempre esta contida entre barras, e a comparacao ocorre com o operador =~. A seguinte expressao e verdadeira se a string aparecer na variavel $sentenca: $sentenca =~ /para/ A ER e case sensitive, de modo que se: $sentenca = "Para as raposas"; entao a comparacao resultara em falsa. O operador !~ e usado para o oposto, sendo assim o exemplo: $sentenca !~ /para/ retorna verdadeiro porque a string nao aparece em $sentenca A variavel especial $_ Nos podemos usar uma condicional como: if ($sentenca =~ /sob/){print "Nos estamos conversando\n";} que devera mostrar a mensagem se tivermos um dos seguintes valores: $sentenca = "Embaixo e sob";$sentenca = "E sobre o assunto..."; Porem e mais frequentemente e muito mais facil se atribuirmos a sentenca a uma variavel especial $_ (certamente escalar). Se nos fizermos isso, entao podemos evitar o uso dos operadores de comparacao e o exemplo acima pode ser escrito como: if (/sob/){print "Nos estamos conversando\n";} A variavel $_ e padrao para muitas operacoes do Perl e tende a ser muito usado. Mais sobre ERs Em uma ER existe uma grande quantidade de caracteres especiais, o que faz com que pareca mais complicado. O melhor modo de construir seus programas e usando ERs aos poucos. Aqui estao alguns caracteres especiais ER e seus significados: . # qualquer caractere exceto newline^ # o inicio da linha ou do caractere$ # o fim da linha ou do caractere* # nenhum, um ou mais do ultimo caractere+ # um ou mais do ultimo caractere?
# nenhum ou o ultimo caractere e aqui alguns exemplos de comparacoes. Recorde que seu uso e sempre entre barras. p.r # p seguido por qualquer caractere seguido por e# isto ira comparar:# par# para# por^f # f no inicio da linha^ftp # ftp no inicio da linhaes$ # es no final da linhaund* # un seguido por nenhum ou varios caracteres d# isto ira comparar:# un# und# undd# unddd (etc).* # qualquer string sem o newline,# isto ocorre porque o . compara qualquer caractere# e o * e o mesmo que nenhum ou mais deste caractere^$ # uma linha vazia Existem ainda mais opcoes. Colchetes podem ser usados para comparar qualquer um destes caracteres dentro deles. Entre colchetes, o simbolo - indica entre e o simbolo ^ no inicio significa nao: [qjk] # tanto q ou j ou k[^qjk] # exceto q, j e k[a-z] # qualquer um entre a e z, inclusive estes[^a-z] # exceto letras minusculas[a-zA-Z] # qualquer letra[a-z]+ # qualquer sequencia com pelo menos uma ou mais letras minusculas As demais opcoes servem mais para referencia. Uma barra vertical | representa ou e os parenteses podem ser usados para agrupar caracteres: geleia|creme # tanto geleia ou creme(ov|dad)os # tanto ovos ou dados(da)+ # tanto da ou dada ou dadada Aqui estao mais alguns caracteres especiais: \n # um newline\t # um tab\w # qualquer caractere alfanumerico (palavra)# o mesmo que [a-zA-Z0-9_]\W # exceto caracteres alfanumericos,# o mesmo que [^a-zA-Z0-9_]\d # qualquer digito# o mesmo que [0-9]\D # exceto digitos, [^0-9]\s # qualquer caractere em branco: espaco,# tab, newline, etc\S # exceto caracteres em branco\b # uma palavra limitada, fora de []\B # nenhuma palavra limitada Esta claro que caracteres como $, |, [, ), \, / sao casos particulares em expressoes regulares. Se voce quiser comparar um ou mais destes caracteres, entao deve sempre precede-los de uma barra invertida: \| # barra vertical\[ # colchetes esquerdo\) # parenteses direito\* # asterisco\^ # circunflexo\/ # uma barra\\ # barra invertida Alguns exemplos de ERs Como foi mencionado antes, o uso de expressoes regulares deve ocorrer aos poucos. Aqui estao alguns exemplos. Lembre-se sempre de usa-los entre barras /.../ [01] # tanto "0" ou "1" \/0 # divisao por zero \/ 0 # divisao por zero com um espaco \/\s0 # divisao por zero com um espaco em branco # "/ 0" onde o espaco pode ser um tab, por exemplo \/ *0 # divisao por zero com nenhum ou alguns espacos # "/0" ou "/ 0" ou "/ 0" etc \/\s+0 # divisao por zero com alguns espacos em branco \/\s+0\.0* # como o anterior, mas com ponto decimal # e alguns zeros depois dele, ou nao # "/ 0." ou "/ 0.0" ou "/ 0.000" etc # observe a barra invertida antes do ponto Exercicios Seu programa anterior contava linhas nao-vazias. Altere ele de modo que conte somente linhas com: a letra x a string para a string para, sendo p maiusculo ou minusculo a palavra para ou Para, use \b para detectar palavras limitadas com um espaco
certos problemas. O codigo: $_ = "Caine::Michael:::Ator";@pessoal = split(/:+/); e o mesmo que: @pessoal = ("Caine", "Michael", "Ator"); mas se nao for usado, entao: $_ = "Caine::Michael:::Ator";@pessoal = split(/:/); sera o mesmo que: @pessoal = ("Caine", "", "Michael", "", "", "Ator"); Uma palavra pode ser separada em caracteres, uma sentenca separada em palavras e um paragrafo em sentencas: @caracteres = split(//, $palavra);@palavras = split(/ /, $sentenca);@sentencas = split(/\./, $paragrafo); No primeiro caso, a string nula e comparada entre cada caractere, e isso ocorre porque @caracteres e uma matriz de caracteres, i.e, uma matriz de strings com comprimento 1. Exercicios Exercicios Uma ferramenta util no processamento de nossa lingua natural e a concordancia. Este permite que uma string especifica seja mostrada em seu contexto imediato, em qualquer lugar que apareca no texto. Por exemplo, um programa de concordancia identificando a string destino par talvez possa produzir alguma das seguintes saidas. Note como as ocorrencias da string destino se alinham verticalmente: o primeiro par de ligacoes ocorreu sendo que para entender os proble no segundo par existe a possibilid s o ultimo par deve conter a final Neste exercicio, voce deve fazer esse programa. Aqui estao algumas dicas: coloque o arquivo inteiro em uma matriz (geralmente isso nao e util porque o arquivo pode ser extremamente grande, mas nao devemos nos preocupar com isso agora). Cada item na matriz sera uma linha do arquivo. quando a funcao chop e usada em uma matriz, ela elimina o ultimo caractere de cada item da matriz. recorde que voce pode juntar a matriz inteira com uma declaracao como $texto = "@linhas"; use a string destino como delimitador para separar o texto (i.e, use a string no lugar dos dois pontos usados nos exemplos anteriores). Voce deve entao ter uma matriz de todas as strings entre cada string destino. para cada elemento da matriz, mostre ele, a string destino, e entao mostre o proximo elemento da matriz. recorde que o ultimo elemento de uma matriz @comida tem indice $#comida. Este deveria ser um bom programa, mas a string destino nao se alinhara verticalmente. Para alinhar essas strings, voce precisara da funcao substr. Aqui estao tres exemplos de seu uso: substr("Era uma vez a...", 3, 4); # retorna " uma"substr("Era uma vez a...", 7); # retorna " vez a..."substr("Era uma vez a...", -6, 5); # retorna "z a.." O primeiro exemplo retorna uma substring de comprimento 4 comecando a partir da posicao 3. Recorde que o primeiro caractere de uma string tem indice zero. No segundo exemplo, se faltar o comprimento, toda a substring a partir da posicao 7 e mostrada. O terceiro exemplo mostra que voce tambem pode contar a partir do final, usando um indice negativo. Ele retorna a substring que comeca a partir do sexto caractere contado da direita para a esquerda com comprimento de 5 caracteres. Se voce usar um indice negativo que estende alem do comeco da string, entao o Perl retornara nada ou uma mensagem de erro. Para evitar que isso ocorra, voce pode aumentar o tamanho da string usando o operador x,