Você está na página 1de 9

VARIVEIS DE CONTEXTO VARIVEIS DE CONTEXTO As variveis de contexto CGI fazem parte da assim chamada "plataforma CGI".

Um servidor web que disponibilize a plataforma tambm disponibiliza as variveis de contexto em nvel de sistema operacional. O script CGI tem acesso a essas variveis, pode l-las e utiliz-las. Tambm pode preencher ou at modificar o contedo de algumas dessas variveis. > Generalidades As variveis de contexto CGI existem independentemente das variveis que forem definidas pelo programador num programa CGI. Nas variveis de contexto CGI esto armazenadas informaes como, por exemplo, o nome do servidor web ou o tipo de navegador que chamou o script. Os valores dessas variveis ficam disposio do script enquanto ele estiver sendo executado. Se o script foi chamado atravs do mtodo GET de um formulrio, os dados enviados pelo formulrio tambm ficam numa varivel de contexto. Para poder acessar as variveis de contexto, o script CGI precisa utilizar as tcnicas de leitura de variveis de contexto proporcionadas pela linguagem de programao utilizada. Em PERL, por exemplo, as variveis de contexto podem ser alcanadas atravs de $ENV{'CONTEXTO_NOMEDAVARIVEL'};. Com um comando como print $ENV{'SERVER_NAME'}; voc pode, por exemplo, determinar o nome do servidor web onde se encontra o script. Como as variveis de contexto, sob o ponto de vista PERL, esto armazenadas em Hash (listas associativas), voc pode listar todas as variveis com um comando como print %ENV. > Panormica das Variveis de Contexto CGI CONTENT_LENGTH: Contm o nmero total de caracteres que o script CGI precisa ler como parmetros enviados atravs do mtodo POST. CONTENT_TYPE: Contm o Mime-Type dos parmetros enviados ao script CGI atravs do mtodo POST. Se o script for chamado atravs do mtodo POST de um formulrio, o MimeType tpico application/x-www-form-urlencoded. GATEWAY_INTERFACE: Contm a verso da plataforma CGI instalada no servidor web, por exemplo, CGI/1.1 HTTP_ACCEPT: Contm a lista de Mime-Types que o navegador requisitante suporta. O valor */* significa que o navegador suporta todos os tipos. HTTP_REFERER: Contm o endereo URL da pgina que chamou o script CGI. Nem todos os navegadores fornecem este parmetro, portanto, esta varivel nem sempre tem um valor disponvel. HTTP_USER_AGENT: Contm informaes do tipo e da verso do navegador requisitante. Portanto, possvel saber qual navegador o usurio est utilizando. PATH_INFO: Contm informaes de path quando o script solicitado atravs do mtodo GET, sempre relativo ao diretrio raiz do servidor web. PATH_TRANSLATED: Contm informaes especiais de path quando o script solicitado atravs do mtodo GET. Difere do PATH_INFO porque corresponde estrutura de diretrios do servidor. QUERY_STRING: Contm uma string de dados fornecida ao script atravs de uma chamada

pelo mtodo GET. Os dados seguem o padro Mime-Type application/x-www-form-urlencoded. REMOTE_ADDR: Contm o endereo IP do servidor web atravs do qual o script CGI foi chamado se este servidor no for o que contm o script. Este valor nem sempre pode ser obtido. REMOTE_HOST: Contm o endereo do domnio do servidor web atravs do qual o script CGI foi chamado se este servidor no for o que contm o script. Este valor nem sempre pode ser obtido. REMOTE_IDENT: Contm informaes de protocolo se no servidor web estiver ativado o protocolo ident para acessos protegidos. REMOTE_USER: Contm o nome do usurio que chamou o script CGI. Este valor s est disponvel se a autenticao do servidor web estiver ativada. REQUEST_METHOD: Contm o mtodo pelo qual o script CGI foi chamado, ou seja, GET ou POST. Um script CGI pode, por exemplo, obter o valor dessa varivel para poder decidir como ir receber os parmetros enviados: atravs da entrada padro (do mtodo POST) ou da varivel de contexto QUERY_STRING (do mtodo GET). SCRIPT_NAME: Contm o endereo URL do script CGI chamado relativo ao endereo de domnio, ou seja, por exemplo, /cgi-bin/busca.pl SERVER_NAME: Contm o nome do servidor web (www.xyz.com, por exemplo) ou seu endereo IP (127.0.0.1, por exemplo). SERVER_PORT: Contm o nmero da porta que foi designada para o servidor. Normalmente, para servidores web, a porta 80. SERVER_PROTOCOL: Contm a verso do protocolo HTTP que o servidor web utiliza, por exemplo, HTTP/1.0 SERVER_SOFTWARE: Contm a definio do software instalado no servidor web, por exemplo, OmniHTTPd/2.0a1 (Win32; i386)

Tutorial de Perl com MySQL - Fazendo conexes, listando e cadastrando contedo.


Vamos l... Lembrando que voc tem que ter os seguintes mdulos: DBI e DBD::Mysql Voc pode fazer download dos mesmos no site do CPAN (www.cpan.org) ou instala-los pelo PPM com o seguinte comando (no modo de comando): PPM ppm install dbi ppm install dbd::mysql Feito isso... Para realizar a conexo com o mySQL: use DBI(); $database = "nome da database"; $host = "endereo do host"; $usuario = "usuario de login"; $senha = "senha"; my $dbh = DBI->connect("DBI:mysql:database=$database;host=$host","$usuario", "$senha",{'RaiseError' => 1});

Feito a conexo, j podemos listar o contedo de alguma tabela (pre-criada): $sth = $dbh->prepare("SELECT * FROM tabela"); $sth->execute(); while(($campo1,$campo2) = $sth->fetchrow_array) { print "$campo1 $campo2<br>"; } $sth->finish();

Para inserir dados em uma tabela... $dbh->do("INSERT INTO tabela (nome_campo_1, nome_campo_2) VALUES ('$valor_campo_1', '$valor_campo_2')");

Para executar outros comandos no banco de dados (usando SQL) [para saber mais comandos visite www.mysql.com]... $dbh->do("comando aqui dentro");

Criando e aprendendo a usar Expresses Regulares. Expresses Regulares A compreenso do funcionamento das Expresses Regulares e dos operadores e funes relacionados a manipulao dessas expresses, na Perl, um dos passos fundamentais para a programao rpida e eficiente que nos proporcionada por essa linguagem extremamente flexvel e produtiva. Pode-se dizer de uma Expresso Regular, que ela uma "regra" que permite descrever, precisamente, todos os elementos de um conjunto, seja este finito ou infinito, sem a necessidade de enumer-los explicitamente. Por exemplo, a expresso regular '^0-9$' descreve os algarismos de 0 a 9 e a expresso '^a-zA-Z$', as letras maisculas e minsculas do alfabeto, incluindo-se "k" ou "K", "w" ou "W" e "y" ou "Y". Nesse artigo, irei descrever como elaborar expresses regulares e como aplic-las na soluo de problemas computacionais. Explicarei, tambm, o comportamento do sub-grupo (no todos eles) das estruturas de dados, das funes e dos operadores que tm sua operao baseada na avaliao de expresses regulares. 1. Elaborando Expresses Regulares A elaborao de uma expresso regular feita atravs de caracteres e metacaracteres. Os caracteres iro sempre descrever elementos explcitos e os metacaracteres, elementos implcitos e as condies em que esses elementos ocorrem dentro de um conjunto. Como exemplo, vamos tomar duas expresses regulares: '^a{1,2}$' e '^(a|b){1,3}$'. A primeira, descreve o cojunto que contm dois elementos, sendo eles "a" e "aa". J a segunda expresso, descreve o cojunto com os elementos "a", "aa", "aaa", "b", "bb" e "bbb". Estas duas expresses so formadas pelos caracteres "a" e "b", utilizados para compor os elementos do conjunto, e pelos metacaracteres "{}", "()", "|", "^" e "$" que determinam como devem ser feito as composies. O metacaracter formado pelos smbolos "{}", um quantificador que define a quantidade de vezes que um caracter ir ocorrer em um elemento. No primeiro exemplo, ele especifica que os elementos que constituem o conjunto, descrito pela expresso em questo, sero compostos apenas por uma ou duas ocorrncias do caracterer "a". Ainda no primeiro exemplo, existem dois outros metacaracteres, "^" e "$". A funo deles, definir fronteiras, o que significa que os elementos devem ser formados iniciando pelo caracter ou a composio de caracteres que segue o smbolo "^" e terminados pelo caracter ou a composio que antecede "$". Exemplificando, a expresso '^a{1,2}' descreve o conjunto cujos os elementos iniciam com um ou dois caracteres "a", ou seja, um conjunto infinito de elementos. Da mesma forma, a expresso 'a{1,2}$' ir definir um conjunto infinito, e tambm infinito, porm maior ainda, ser o conjunto descrito pela expresso 'a{1,2}' que no estabelece nenhuma fronteira. Em outras palavras, essa expresso ir descrever o conjunto de elementos formados por um subconjunto de caracteres, sendo eles "a" e "aa". sempre bom estar atento a peculiaridades como essa para no cometer erros na elaborao de expresses. Outro exemplo de expresso regular peculiar '^[^-_0-9]'. H duas peculiaridades nessa expresso, tente descobrir quais. Uma delas, ser esclarecida nos prximos captulos, j a outra, voc ter que recorrer s referncias bibliogrficas. :-) Uma expresso regular pode ser composta por caracteres, metacaracteres ou pela combinao de ambos. Quando formada apenas por caracteres, ela ir sempre descrever o conjunto de elementos que possuem ao menos esses caracteres. A expresso 'ch', por exemplo, pode ser usada para descrever o conjunto de palavras que so grafadas com o dgrafo "ch". J a expresso '^ch', descreveria por sua vez o conjunto das palavras que iniciam com esse dgrafo. De maneira anloga a expresso '(ss|rr)(a|e)' ou '(ss|rr)ae' enumeraria as palavras contendo as slabas "ssa", "sse", "rra" e "rre". Outras composies equivalentes seriam: '(s|r) {2}(a|e)' ou 'sr{2}ae'. Ateno, existe uma grande diferena entre as expresses '(s|r){2}' e 's|r{2}'. Essa ltima, enumeraria os elementos "s", "r" e "rr". Tambm entre 'sr{1,2}' e '(sr){1,2}, h uma boa diferena, veja os conjuntos descritos por ambas: "sr", "srr" e "sr", "srsr". O metacaracter

agrupador "()" faz com que o metacaracter que o segue afete o grupo de caracteres como um todo e no individualmente. Bem, creio que nesse ponto a idia de conjuntos descritos atravs de um "regra", a Expresso Regular, deva estar bem elucidada. E para quem nunca havia lidado com expresses regulares, talvez, em algum momento, tenha esbarrado com alguma, pois elas so utilizadas por diversos programas (grep, sed, awk, vi, apache, proftpd, squid, etc.) e liguangens de programao (C, python, php, java e outras). E a razo de tamanha difuso, o fato de serem aplicveis na soluo de um vasto nmero de problemas computacionais, cuja a soluo se torna simplificada, e portanto, fcil de implementar mas sem comprometer o desempenho da aplicao. 2. Metacaracteres A Perl possui vrios metacaracteres para composio de expresses regulares, esses derivados das rotinas de expresses regulares, verso 8. Nesse artigo, no irei descrever todos, apenas os mais importantes. Consulte a referncia bibliografica ao final desse artigo, caso deseje conhecer todos os demais metacaracteres. 2.1. Bsicos A partir desse grupo bsico, possvel compor expresses regulares para descrever qualquer conjunto de elementos. Os smbolos "*", "+" e "?" no foram comentados ainda, mas fcil deduzir que so metacaracteres quantificadores especializados. Por outro lado, "." um tanto diferenciado e representa nada mais, nada menos que qualquer caracterer. Ele uma espcie de "curinga" das expresses regulares. O smbolo "^", assumir outra caracterstica quando no interior e incio do metacaracter "[]". Nessa ocasio, ele ir negar toda a classe de caracteres listada explicita ou implicitamente. Por exemplo, para descrever o conjunto formado pelos elementos constituidos de qualquer caracter com excesso dos dgitos, pode ser utilizada a expresso '[^0123456789]' ou '[^09]'. ^ -> caracter que o segue inicia o elemento $ -> caracter que o antecede finaliza o elemento . -> caracter um smbolo qualquer (exceto nova linha) | -> enumerador de alternativas () -> agrupador [] -> especificificador de classes * -> caracter ocorre 0 ou mais vezes + -> caracter ocorre 1 ou mais vezes ? -> caracter ocorre 1 ou 0 vezes {n} -> caracter ocorre exatamente "n" vezes {n,} -> caracter ocorre pelo menos "n" vezes {n,m} -> caracter ocorre pelo menos "n" vezes e no mais que "m" vezes

2.2. Complementares Alguns desses metacaracteres so teis na representao de diversas classes de caracteres de maneira simplificada e elegante. Essas classes, entretanto, podem, de diferentes formas, serem representadas com a combinao pura e simplesmente dos metacaracteres bsicos. Porm, feito dessa forma, a elaborao de expresses regulares triviais se tornaria bastante complexa.

H tambm um grupo de metacaracteres para a representao de caracteres de controle que no podem ser escritos, como o caso da quebra de linha e da tabulao. \w -> [a-zA-Z_] \W -> [^a-zA-Z_] \s -> [ ] \S -> [^ ] \d -> [0-9], [0123456789] ou (0|1|2|3|4|5|6|7|8|9) \D -> [^0-9] \t -> tabulao \n -> (LF ou NL) nova linha \r -> (CR) retorno \f -> (FF) form feed \e -> (ESC) escape

2.3. O metacaracter especial '\' Em muitas ocasies haver a necessidade de descrever conjuntos que contm elementos formados por smbolos que representam justamente um metacaracter. Nesse caso, utiliza-se "\" para que o outro metacaractere seja tratado como um simples caracter. Ele prprio (o metacaracter "\") precisar, tambm, ser confrontado consigo mesmo para ser considerado um simples caracter. Para a descrio de um conjunto contendo apenas os elementos "U$" e "R$", por exemplo, pode-se usar '^(U\$|R\$)$', '^(U|R)\$$' ou '^UR\$$'. Pense que "\" a criptonita que tira os "poderes" dos metacaracteres, transformando-os em simples caracteres. 3. Aplicando e utilizando expresses regulares Na Perl, a aplicao e utilizao de expresses regulares bastante direta e simples. Devido, principalmente, ao fato da linguagem possuir, para a manipulao dessas expresses, um conjunto de operadores, estruturas de dados e funes, todos eles internos e diversificados. Diferentemente de outras linguagens, onde a manipulao das expresses provida apenas atravs de uma biblioteca externa de funes. E , por se diferenciar nesse aspectado de outras linguagens, e tambm pela riqueza de recursos disponveis para manipulao de expresses, que considero a Perl a linguagem das expresses regulares. 3.1. Operadores Bsicos As operaes com expresses regulares baseam-se simplesmente em constatar ou verificar se um elemento (uma "string" de caracteres) pertence ou no ao conjunto descrito por esta ou aquela expresso regular. Quando uma expresso submetida a um operador, o grupo de caracteres e metacarateres que a compe devem ser envolvido pelo caracter "/". Essa uma notao sinttica e, por tanto, deve ser sempre obedecida. Para a operao bsica, utilizam-se os operadores "=~" e "!~" que corresponem, respectivamente, as operaes "pertence" e "no pertence". O resultado dessas operaes poder ser logicamente avaliado, mas no somente isso, dependendo da expresso submetida. Vejamos um exemplo prtico de um programa que recebe uma lista de URLs (ex.: http://cascavel.pm.org) e descreve cada uma delas de acordo com o prefixo identificador do servio: my $url; foreach $url (@ARGV) { if ($url =~ /^http:/) { print "Endereo de um servio WEB\n"; }

elsif ($url =~ /^https:/) { print "Endereo de um servio WEB seguro\n"; } elsif ($url =~ /^ftp:/) { print "Endereo de um servio FTP\n"; } }

3.2. Referncias O metacaracter agrupador "()" alm da funo primria, possui uma segunda funo, e que tambm bastante til, alm de poderosa se bem empregada. Quando uma expresso com esse metacarater operada, os caracteres do elemento avaliado, que correspodem a subexpresso agrupada, sero extrados da esquerda para a direita e armazenados nas variveis reservadas ($1, $2, $3, etc.). Em outras palavras, criado uma referncia s partes do elemento (a "string") em anlise. O exemplo abaixo exemplifica bem essa funcionalidade: my $url; foreach $url (@ARGV) { if ($url =~ /^(.+):\/\/(.*)$/) print "-- $2: "; if ($1 eq 'http') { print "endereo de servio WEB\n"; } elsif ($1 eq 'http') { print "endereo de servio WEB seguro\n"; } elsif ($1 eq 'ftp') { print "endereo de servio de FTP\n"; } else { print "endereo de um servio desconhecido\n"; } } else { print "Url invlida\n"; } } Para no se confundir com o caracter sinttico "", que envolve uma expresso regular, esse mesmo caracter, quando no interior da expresso, deve ser antecedido pelo metacaracter "\". O caracter "" que delimita a expresso regular, no simplesmente um delimitador, de fato, a composio "/" uma simplificao de "m", onde "m" significa "match". H tambm uma outra composio, "s//, onde "s" significa "substitute". Ambas as composio suportam os modificadores abaixo: i -> avalia desconsiderando maisculas e minsculas m -> avalia considerando "string" com mais de uma linha s -> avalia considerando "string" com uma nica linha x -> avalia desconsiderando espaos e comentrios g -> avalia ou substitui (quando "s///") globalmente O operador "s//" tem um comportamento bastante diferenciado. Ele possui dois operandos em vez de apenas um, como no caso de "m" (ou simplesmente "/"). Sendo os operandos, uma

expresso regular e uma "string". Veja abaixo a composio sinttica desse operando: Sintaxe: s/REX/STRING/imsxg onde, REX -> expresso regular STRING -> um grupo de caracteres para substituio imsxg -> modificadores Sua operao consiste em confrontar um elemento com uma expresso regular e substituir por "STRING" as partes desse elemento pertencentes ao cojunto descrito por "REX". Aps analisar os exemplos abaixo, percebe-se que as possibilidades de aplicao desse operador so infinitas, mesmo sendo os exemplos triviais. E combinado com expresses regulares usando o metacaracter "()" e as variveis reservadas ($1, $2, $3, etc.), pode-se fazer, acho, qualquer tipo de manipulao com "strings". Experimente! my $elemento; $elemento = '-a-A-a-A-a-A-a-A-a-A'; $elmento =~ s/a/+/; print "$elemento\n"; # Resultar em: -+-A-a-A-a-A-a-A-a-A $elemento = '-a-A-a-A-a-A-a-A-a-A'; $elemento =~ s/a/+/g; print "$elemento\n"; # Resultar em: -+-A-+-A-+-A-+-A-+-A $elemento = '-a-A-a-A-a-A-a-A-a-A'; $elemento =~ s/a/+/gi; print "$elemento\n"; # Resultar em: -+-+-+-+-+-+-+-+-+-+ # # Esse exemplo, uma alternativa ao anterior # $elemento = '-a-A-a-A-a-A-a-A-a-A'; $elemento =~ s/[aA]/+/g; print "$elemento\n"; # Resultar em: -+-+-+-+-+-+-+-+-+-+ # # Aplicando o metacaracter "()" # $elemento = '-a-A-a-A-a-A-a-A-a-A'; $elemento =~ s/([aA])/($1)/g; print "$elemento\n"; # Resultar em: -(a)-(A)-(a)-(A)-(a)-(A) -(a)-(A)-(a)-(A)

3.3. Funes Existem duas funes, em especial, que operam com base em uma expresso regular, so elas: "split" e "grep". A primeira, quebra uma "string" em uma lista de "strings", considerando como delimitadores para a quebra, caracteres que pertenam a um determinado conjunto. A sengunda, percorre um "array" e retorna os elementos que tambm estejam contidos em um cojunto. bvio que o conjunto considerado por ambas as funes, definido por uma expresso regular.

# # Usando o "split" # my $frase = 'Quantas palavras existem nesse frase?'; my @palavras = split /\s+/; print "Total: ",scalar @palavras,"\n"; # # Usando "grep" com uma expresso regular # my @numeros = (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20); my @numeros_pares = grep /[02468]$/,@numeros;

4. Bibliografia Online * Ttulo: Expresses Regulares * Descrio: Um excelente guia, escrito por Aurlio Marinho Jargas. * Ttulo: PerlRE man page * Descrio: Essa a documentao oficial sobre Expresses Regulares na Perl.