r2 - 05 Mar 2006 - IgorSutton
NOME
File::Glob - extensão Perl para a rotina glob do BSDSINOPSE
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/*>;
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 seqüência de caracteres
? Combina qualquer caracter
~ O diretório home do usuárioA 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 parabsd_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 dobsd_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 sistemaARG_MAX(geralmente encontrada em limits.h). Se o seu sistema não deifni esta constante,bsd_glob()utilizasysconf(_SC_ARG_MAX)ou_POSIX_ARG_MAX, caso estejam disponíveis (nesta ordem). Você pode verificar estes valores utilizando a extensão padrãoPOSIX. 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 contentdo apenas o padrão. CasoGLOB_QUOTEesteja ativo, seu efeito está presente no padrão retornado. GLOB_NOSORT
- Por padrão, os caminhos serão ordenados em ordem ASCII, ascendente; esta flad previne esta ordenação (melhorando a performande de bsd_glob()).
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 caracter em um padrão é substituida por aquele caracter, evitando qualquer interpretação especial deste. (Veja abaixo para excessõ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.
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_NOSORTnã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.
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á atribuida. &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.
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 atribuido.
Esteja avisado que todos os nomes de arquivos retornados por File::Glob são marcados (tainted).
NOTAS
-
Caso você queira utilizar diversos padrões, como por exemplo
bsd_glob("a* b*"), você deve colocá-los em um conjunto como bsd_glob("{a*, b*}"). Isto porque o argumento de bsd_glob() não será interpretado pelo C shell. Lembre-se que você pode utilizar uma contrabarra para escapar caracteres.
Em sistemas DOS, a contrabarra é o caractere separador de diretórios. Neste caso, a utilização da contrabarra como caractere de escape (via GLOB_QUOTE) interfere na utilização da contrabarra como separador de diretórios. O melhor (mais simples, mais portável) é utilizar barras para separadores de diretórios, e contrabarras para escape. Entretante, esta não combina com a prática normal destes sistemas. Como uma concessão para a expectativa dos usuários, contrabarras (sob GLOB_QUOTE) apenas escapam os meta-caracteres glob '[', ']', '{', '}', '-', '~' e a contrabarra. Todas outras contrabarras não são modificadas.
Usuários da plataforma Win32 devem utilizar a barra. Se você realmente quer utilizar contrabarras, considere a utilização do File::DosGlob, escrito por Sarathy, que vêm na distribuição padrão do Perl.
Usuários de Mac OS (Clássico) devem notar algumas diferenças. Como Mac OS não é Unix, quando o código do glob encontra um 'til' (por exemplo, ~usuario) e GLOB_TILDE está ativo, ele irá retornar o padrão sem fazer nenhuma expansão.
Glob no Mac OS não se importa com caixas alta ou baixa por padrão (se você não utilizar nenhuma flag). Caso você especifique alguma flag e ainda queira que o glob seja insensivel com as caixas, você deve incluir GLOB_NOCASE.
O separador de diretórios é ':' (mais conhecido como 'dois pontos') e não '/' (barra). Usuários de Mac OS devem ser cuidadosos ao especificar caminhos relativos. Enquanto um caminho completo sempre inicia com o nome do volume, o caminho relativo deve sempre começar com ':'. Se você estiver especificando um nome de volume apenas, ':' ao final do nome do volume é necessário.
A especificação dos nomes nos padrões do glob adere às convenções do Mac OS: O separador de diretórios é o dois-pontos ':', não a barra '/'. O caminho completo sempre começa com o nome do volume. Um caminho relativo no Mac OS deve sempre começar com ':', exceto quando especificando um arquivo ou diretório no diretório de trabalho atual, onde um ':' no início é opcional. Caso seja especificado apenas um nome de volume, é necessário concatenar um ':' ao final. Devido a estas regras, um glob como <*:> irá encontrar todos os volumes montados, enquanto um glob como <*>> > ou <:*> encontrará todos os arquivos e diretórios do diretório corrente.
Note que os diretórios acima no padrão do glob são resolvidos antes que a combinação comece, isto é, um padrão como ``*HD:t?p::a*'' será combinado como ``*HD:a*''. Note também que um único ':' no padrão é ignorado (a menos que seja um padrão de nome de volume como ``*HD:''), isto é, um glob como <:*:> irá encontrar diretórios e arquivos (e não, como podíamos esperar, apenas diretórios). Você pode, entretanto, utilizar GLOB_MARK para distiguir (sem testar o arquivo) nomes de diretórios e arquivos.
Caso GLOB_MARK esteja ativo, todos os caminhos de diretórios terão um ':' concatenado no final. Como um diretório como 'lib:' não é um caminho relativo válido no Mac OS, serão concatenadas no início e no final, quando o nome do diretório em questão não tiver nenhum dois-pontos (por exemplo, 'lib' se tornará ':lib:').
VEJA TAMBÉM
glob in the perlfunc manpage, the glob(3) manpageAUTOR
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.
