2009-10-05 3 views
2

This answer indique que glob peut parfois renvoyer des 'noms de fichiers' qui n'existent pas.Comment glob retourne-t-il des 'noms de fichiers' qui n'existent pas?

@deck = glob "{A,K,Q,J,10,9,8,7,6,5,4,3,2}{\x{2660},\x{2665},\x{2666},\x{2663}}"; 

Toutefois, ce code renvoie une liste vide lorsque je l'exécute.

Qu'est-ce qui me manque? Cette exécution provenait de l'invite de commande utilisant -e, sous Windows XP, avec ActiveState Perl version 5.005_02. L'exécution à partir d'un script enregistré sur la même machine donne les mêmes résultats.

L'exécution de -e sous Windows XP, avec ActiveState Perl v5.8.7, renvoie un tableau.

+0

S'il vous plaît fournir plus de détails sur la façon dont vous l'avez exécuté. (Par exemple, code complet, version Perl.) –

+0

Et le système d'exploitation. –

+1

Wow, je n'ai jamais réalisé que cette méthode fonctionnait comme ça. C'est une bonne méthode pour effectuer une permutation combinatoire rapide et sale sur les ensembles! – Ether

Répondre

5

Perl Version 5.005_02 est ancienne (en Perl). Cette version a probablement une implémentation différente de glob qui ne retourne pas les noms des fichiers qui n'existent pas. Comme vous l'avez remarqué, les versions ultérieures de Perl fonctionnent différemment.

+2

En effet. Les versions de Perl antérieures à la version 5.6 n'utilisaient pas le fichier File :: Glob fourni avec Perl. Et, non seulement 5.005_02 ancien, il est même ancien dans la série 5.005. –

+1

Eh bien, j'ai supprimé ma réponse. Cela semble être le bon. Un indice: selon perlport, ne comptez pas sur la globbing. –

+0

En outre, la syntaxe de code hexadécimal utf8 \ x {xxxx} ne fonctionne pas sur 5.005. – ysth

2

Cela fonctionne correctement sur ma machine, v5.10.0.

#!/usr/bin/perl 

@deck = glob "{A,K,Q,J,10,9,8,7,6,5,4,3,2}{\x{2660},\x{2665},\x{2666},\x{2663}}"; 

print @deck 

donne en sortie:

A♠A♥A♦A♣K♠K♥K♦K♣Q♠Q♥Q♦Q♣J♠J♥J♦J♣10♠10♥10♦10♣9♠9♥9♦9♣8♠8♥8♦8♣7♠7♥7♦7♣6♠6♥6♦6♣5♠5♥5♦5♣4♠4♥4♦4♣3♠3♥3♦3♣2♠2♥2♦2♣ 
+0

Hmmm. Il semble "fonctionner" sur ma machine v5.8.7, mais pas sur la v5.005_02. Nouvelle fonctionnalité, peut-être? – Rini

+4

De perldoc-f glob: "Commençant avec v5.6.0, cet opérateur est implémenté en utilisant l'extension standard" File :: Glob "." Je m'attends à ce que l'implémentation de pre-File :: Glob fonctionne différemment. – Ether

+0

On dirait que j'ai raté un représentant en publiant cela comme un commentaire plutôt que comme une réponse. Upvoters sûr sont volage :) – Ether

1

Cela fonctionne bien pour moi - c'est-à-dire qu'il génère un jeu de cartes, j'utilise perl 5.8.8.

Mais. Utiliser glob pour cela semble étrange - je veux dire - sûr, c'est possible, mais glob est un outil pour faire correspondre les fichiers qui n'est pas garanti pour vérifier réellement les fichiers, mais personne ne dit qu'il va pas correspondre aux fichiers dans le avenir!

Je voudrais certainement aller avec une autre approche. Par exemple comme ceci:

my @cards = qw(A K Q J 10 9 8 7 6 5 4 3 2); 
my @colors = ("\x{2660}", "\x{2665}", "\x{2666}", "\x{2663}"); 

my @deck = map { 
    my $card = $_; 
    map { "$card$_" } @colors 
} @cards; 

Ou, si vous trouvez la carte {carte} trop cryptique:

my @deck; 
for my $card (@cards) { 
    for my $color (@colors) { 
     push @deck, "$card$color"; 
    } 
} 
Questions connexes