glob如何返回不存在的'文件名'?

时间:2009-10-05 20:52:52

标签: perl glob

This answer表示glob有时会返回不存在的'文件名'。

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

但是,当我运行它时,该代码会返回一个空列表。

我错过了什么?


此运行来自Windows XP上使用-e的命令提示符,ActiveState Perl版本为5.005_02。从同一台机器上保存的脚本运行会产生相同的结果。

在Windows XP上运行-e,使用ActiveState Perl v5.8.7,确实会返回一个数组。

3 个答案:

答案 0 :(得分:5)

Perl版本5.005_02是古代(以Perl术语表示)。该版本可能具有glob的不同实现,它不返回不存在的文件的名称。正如您所注意到的,Perl的更高版本的工作方式不同。

答案 1 :(得分:2)

在我的机器上运行正常,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♣

答案 2 :(得分:1)

它适用于我 - 即它产生一副牌,我使用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;

或者,如果你发现地图{map}太神秘了:

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