• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Rui Carlos

[Perl] Problema na função basename

13 mensagens neste tópico

use File::Basename;

print basename("/foo/bar")."\n";
print basename("/foo/bar/")."\n";

Quando executo esta script obtenho:

bar

Mas pelo que li na documentação (e tendo em conta o resultado da função basename na bash), deveria dar

bar
bar

Isto é um bug ou sou eu que estou a fazer alguma coisa mal?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Teste o seguinte código:

#!/usr/bin/perl

use strict;

use File::Basename;

my $a = basename("/foo/bar");

print "$a\n";

my $b = basename("/foo/bar");

print "$b\n";

e obtive o seguinte output:

bar

bar

Também testei o teu código e o resultado foi o mesmo que o meu até porque não existe nenhuma diferença significativa entre o meu código e todo (para além do meu consumir mais memória).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tenho o mesmo resultado que você Rui Carlos:

use File::Basename;

print basename("/foo/bar")."\n";#SEM A FORWARD SLASH NO FIM.
print basename("/foo/bar/")."\n";#COM A FORWARD SLASH NO FIM.

Resultado:

bar

O falco tem ambos os basenames's sem slash, o resultado foi:

bar
bar

A sua intenção é manter o slash no fim? :hmm: Se sim, então acho que o resultado está correcto.

EDIT

Li melhor a perldoc lá tem escrito:

(...)This function is provided for compatibility with the Unix shell command basename(1) . It does NOT always return the file name portion of a path as you might expect.To be safe, if you want the file name portion of a path use fileparse().(...)

Poderá ser esse o problema.

Cumprimentos :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Fiz o seguinte:

$ ./base.pl

bar

bar

$ cat base.pl

#!/usr/bin/perl

use strict;

use File::Basename;

print basename("/foo/bar")."\n";

print basename("/foo/bar/")."\n";

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A sua intenção é manter o slash no fim? :hmm: Se sim, então acho que o resultado está correcto.

EDIT

Li melhor a perldoc lá tem escrito:

(...)This function is provided for compatibility with the Unix shell command basename(1) . It does NOT always return the file name portion of a path as you might expect.To be safe, if you want the file name portion of a path use fileparse().(...)

Poderá ser esse o problema.

Esta script vai receber um argumento que poderá ser um directório, e depois vou criar um novo arquivo a partir desse directório, usando o nome do directório dado. O problema é que o directório pode ser fornecido da forma "xpto/". Então eu preciso de extrair apenas o "xpto". Ou seja, eu nem sempre quero o filename (no caso em que a parte do filename está em branco, eu quero o nome da pasta que está imediatamente antes).

A função basename da bash faz precisamente o que eu quero, já a do Perl parece que devolve apenas o que está depois da última "/". O que é estranho é que na documentação do Perl, é dito que a função faz o que eu quero e tem lá precisamente o exemplo que eu usei, e diz que devolve "bar" nos dois casos. De acordo com a documentação, a função faz o que eu quero, mas quando testo, não faz :)

Falco, poderá isto ser um problema de SOs (estou a usar MacOSX) ou de versões do Perl/biblioteca? (Como não uso muito Perl não sei se é vulgar acontecer alguma destas situações).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nunca vi nada disso. Aqui na minha empresa todos programamos em Perl, durante a maior parte do dia, usando várias distribuições de GNU/Linux e MacOS X. Nunca vi nada disso.

Quando apanhar aqui alguém com MacOS X e que esteja com tempo livre, peço-lhe para testar esse código.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Segundo o que aí diz (que é o mesmo que eu já tinha lido em vários outros locais):

# Both return "bar"
basename("/foo/bar");
basename("/foo/bar/");

Ou seja, devia funcionar como eu queria, isto é, devolver "bar" nos 2 casos, mas não é isso que está a acontecer...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Testei isso em Linux e já funcionou com devia... O problema deve ser do SO.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Testei a script no MacOSX 10.5 e parece que já funciona... Na altura, para resolver o problema, copiei o código da funções do módulo para a minha script, mas é uma solução um pouco estúpida  B)

Já fiz um report por mail há uns meses, e ainda não deu em nada... Alguém conhece uma forma mais eficiente de reportar o problema?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Fiz o report para bug-perl@rt.cpan.org

O erro tanto ocorre no Perl que vem com o MacOSX, como no que é instalado com o MacPorts.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora