Как glob возвращает «имена файлов», которые не существуют? - PullRequest
2 голосов
/ 06 октября 2009

Этот ответ указывает, что glob может иногда возвращать «имена файлов», которые не существуют.

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

Однако этот код возвращает пустой список, когда я его запускаю.

Что мне не хватает?


Этот запуск выполнялся из командной строки с использованием -e в Windows XP с ActiveState Perl версии 5.005_02. Запуск из сохраненного скрипта на той же машине дает те же результаты.

Запуск с -e в Windows XP с ActiveState Perl v5.8.7 возвращает массив.

Ответы [ 3 ]

5 голосов
/ 06 октября 2009

Perl версия 5.005_02 древняя (в терминах Perl). Эта версия, вероятно, имеет другую реализацию glob, которая не возвращает имена файлов, которые не существуют. Как вы заметили, более поздние версии Perl работают по-другому.

2 голосов
/ 06 октября 2009

Это правильно работает на моей машине, 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

дает в качестве вывода:

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♣
1 голос
/ 06 октября 2009

У меня это хорошо работает - то есть генерирует колоду карт, я использую Perl 5.8.8.

Но. Использование glob для этого кажется странным - я имею в виду - конечно, это возможно, но glob - это инструмент для сопоставления файлов, который не гарантирует фактическую проверку файлов, но никто не говорит, что он будет не совпадать файлы в будущем!

Я бы определенно пошел с другим подходом. Например, как это:

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;

Или, если вы нашли карту {карту} слишком загадочной:

my @deck;
for my $card ( @cards ) {
    for my $color ( @colors ) {
        push @deck, "$card$color";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...