Perl Brasil

Pesquisar

Documentação

Artigos

Planeta

Eventos


FISL 10 - Software Livre, a tecnologia que liberta

Comunidade

r3 - 03 Jul 2009 - RonaldoLima


NOME

File::Glob - extensão Perl para a rotina glob do BSD

voltar para o topo


SINOPSE

  use File::Glob ':glob';
  @list = bsd_glob('*.[ch]');
  $homedir = bsd_glob('~gnat', GLOB_TILDE | GLOB_ERR);
  if (GLOB_ERROR) {
    # um erro aconteceu enquanto lia $homedir
  }
  ## sobrescreve o glob do Perl (CORE::glob() faz isto automaticamente
  ## desde v5.6.0)
  use File::Glob ':globally';
  my @sources = <*.{c,h,y}>;
  ## sobrescreve o glob do Perl, forçando sensitividade a letras maiúsculas
  ## e minúsculas
  use File::Glob qw(:globally :case);
  my @sources = <*.{c,h,y}>;
  ## sobrescreve o glob do Perl, forçando insensitividade à caixa das letras
  use File::Glob qw(:globally :nocase);
  my @sources = <*.{c,h,y}>;
  ## lista todos os arquivos do diretório home.
  use File::Glob ':globally';
  my @sources = <~gnat/*>;

voltar para o topo


DESCRIÇÃO

O operador glob <> é um gerador de caminhos que implementa as regras para teste de padrões (pattern matching) de nome de arquivo utilizados por shells do Unix, como Bourne shell ou o C shell. File::Glob::bsd_glob() implementa a rotina the glob(3) manpage do FreeBSD? , que é um conjunto do glob() POSIX (descrito na IEEE Std 1003.2 ``POSIX.2''). bsd_glob() necessita de um argumento obrigatório pattern, e um argumento opcional flags. Ele retorna uma lista de nomes de arquivos que são encontrados de acordo com o padrão, com a interpretação do padrão modificado pelo argumento flags. Desde a versão 5.6.0 do Perl, a função CORE::glob() é implementada nos termos da função bsd_glob(). Note que elas não compartilham o mesmo protótipo -- CORE::glob() aceita apenas um argumento. Devido a razões históricas, CORE::glob() irá também dividir seus argumentos nos espaços em branco, tratando como múltiplos padrões, enquanto bsd_glob() os considera apenas um padrão.

META-CARACTERES

  \       Escapa o próximo meta-caracter
  []      Classe de caracteres
  {}      Múltiplos padrões
  *       Combina qualquer sequência de caracteres
  ?       Combina qualquer caractere
  ~       O diretório home do usuário
A metanotação a{b,c,d}e é um atalho para abe ace ade. A ordem da esquerda para direita é preservada, com o resultado da combinação sendo classificada separadamente para preservar esta ordem. Em um caso especial, {, }, e {} não são percebidos.

FLAGS POSIX

As flags POSIX definidas para bsd_glob() são:

GLOB_ERR
Força bsd_glob() retornar um erro quando ele encontra um diretório que não pode ser aberto ou lido. O comportamento padrão do bsd_glob() é continuar a encontrar combinações.

GLOB_LIMIT
Faz bsd_glob() retornar um erro (GLOB_NOSPACE) quando o padrão expande para um tamanho maior do que aquele encontrado na constante de sistema ARG_MAX (geralmente encontrada em limits.h). Se o seu sistema não defini esta constante, bsd_glob() utiliza sysconf(_SC_ARG_MAX) ou _POSIX_ARG_MAX, caso estejam disponíveis (nesta ordem). Você pode verificar estes valores utilizando a extensão padrão POSIX.

GLOB_MARK
Cada caminho que é um diretório que combina com o padrão terá uma barra '/' concatenada.

GLOB_NOCASE
Por padrão, os nomes de arquivos são sensitivos a letras maiúsculas e minúsculas; esta flag faz com que bsd_glob() não trate diferenças entre caixa alta ou baixa.

GLOB_NOCHECK
Caso o padrão não combine com nenhum caminho, então bsd_glob() retorna uma lista contendo apenas o padrão. Caso GLOB_QUOTE esteja ativo, seu efeito está presente no padrão retornado.

GLOB_NOSORT
Por padrão, os caminhos serão ordenados em ordem ASCII, ascendente; esta flag previne esta ordenação (melhorando a performance de bsd_glob()).
As extensões FreeBSD? para o padrão POSIX são as seguintes:

GLOB_BRACE
Preprocessa a string para expandir {pat,pat,...} como csh(1). O padrão '{}' não é expandido por razões históricas (csh(1) faz o mesmo para facilitar a digitação de padrões para o find(1)).

GLOB_NOMAGIC
O mesmo que GLOB_NOCHECK, porém retorna apenas o padrão se este não contém nenhum dos caracteres especiais ``*'', ``?'' ou ``[''. NOMAGIC é provido para simplificar a implementação do histórico comportamento do globbing do the csh(1) manpage e provavelmente não deve ser utilizado.

GLOB_QUOTE
Utilize a contrabarra ('\') para escapar caracteres: toda ocorrência de uma contrabarra seguida por um caractere em um padrão é substituída por aquele caractere, evitando qualquer interpretação especial deste. (Veja abaixo para exceções em sistemas DOS).

GLOB_TILDE
Expande padrões que iniciam com '~' para o diretório home do usuário.

GLOB_CSH
Por conveniência, GLOB_CSH é um sinônimo para
GLOB_BRACE | GLOB_NOMAGIC | GLOB_QUOTE | GLOB_TILDE | GLOB_ALPHASORT.
As flags GLOB_APPEND, GLOB_DOOFFS foram providas pelo POSIX, e as extensões GLOB_ALTDIRFUNC, e GLOB_MAGCHAR do FreeBSD? não foram implementadas na versão Perl pois elas envolvem interações mais complexas com as estruturas C. A seguinte flag foi adicionada na implementação Perl para compatibilidade csh:

GLOB_ALPHASORT
Caso GLOB_NOSORT não esteja ativa, a ordenação dos nomes de arquivos será em ordem alfabético (sem se importar com caixa alta ou baixa) ao invés de ser ordenado por ASCII.

voltar para o topo


DIAGNÓSTICOS

bsd_glob() retorna uma lista de caminhos que combinam com o padrão, podendo estar vazia. Caso um erro tenha ocorrido, &File::Glob::GLOB_ERROR será diferente de zero e $! será atribuída. &File::Glob::GLOB_ERROR será zero, ou algum dos valores seguintes caso um erro tenha ocorrido:

GLOB_NOSPACE
Uma tentativa para alocação de memória falhou.

GLOB_ABEND
O glob foi parado pois um erro foi encontrado.
No caso de bsd_glob() ter encontrado algumas combinações, mas seja interrompido por um erro, ele retornará a lista de arquivos e atribuirá &File::Glob::ERROR. Note que bsd_glob() deriva do comportamento do the glob(3) manpage de POSIX e do FreeBSD? por não considerar ENOENT e ENOTDIR como erros - bsd_glob() irá continuar processando apesar destes erros, a menos que GLOB_ERR seja atribuído. Esteja avisado que todos os nomes de arquivos retornados por File::Glob são marcados (tainted).

voltar para o topo


NOTAS

voltar para o topo


VEJA TAMBÉM

glob in the perlfunc manpage, the glob(3) manpage

voltar para o topo


AUTOR

A interface Perl foi escrita por Nathan Torkington <gnat@frii.com>, e foi disponibilizada sob a artistic license. Modificações posteriores foram feitas por Greg Bacon <gbacon@cs.uah.edu>, Gurusamy Sarathy <gsar@activestate.com> e Thomas Wegner <wegner_thomas@yahoo.com>. O código glob C tem o seguinte copyright:
    Copyright (c) 1989, 1993 The Regents of the University of California.
    All rights reserved.
    This code is derived from software contributed to Berkeley by
    Guido van Rossum.
    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:
    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright
       notice, this list of conditions and the following disclaimer in the
       documentation and/or other materials provided with the distribution.
    3. Neither the name of the University nor the names of its contributors
       may be used to endorse or promote products derived from this software
       without specific prior written permission.
    THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.

voltar para o topo


TRADUÇÃO

Igor Sutton Lopes <igor@izut.com>

voltar para o topo