2

这个答案表明 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 运行会返回一个数组。

4

3 回答 3

5

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

于 2009-10-05T21:38:59.697 回答
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♣
于 2009-10-05T20:57:20.920 回答
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{map} 太神秘:

my @deck;
for my $card ( @cards ) {
    for my $color ( @colors ) {
        push @deck, "$card$color";
    }
}
于 2009-10-06T06:48:47.820 回答