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

发布于 2024-08-06 12:40:52 字数 506 浏览 7 评论 0原文

这个答案表明 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 上使用 ActiveState Perl 版本 5.005_02 从命令提示符处使用 -e 进行的。在同一台计算机上运行保存的脚本会产生相同的结果。

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

This answer indicates that glob can sometimes return 'filenames' that don't exist.

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

However, that code returns an empty list when I run it.

What am I missing?


This run was from the command prompt using -e, on Windows XP, with ActiveState Perl version 5.005_02. Running from a saved script on the same machine yields the same results.

Running with -e on Windows XP, with ActiveState Perl v5.8.7, does return an array.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

西瓜 2024-08-13 12:40:52

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

Perl version 5.005_02 is ancient (in Perl terms). That version probably has a different implementation of glob that doesn't return names of files that don't exist. As you've noticed, later versions of Perl work differently.

我乃一代侩神 2024-08-13 12:40:52

在我的机器 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♣

That works correctly on my 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

gives as output:

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♣
断肠人 2024-08-13 12:40:52

它对我来说效果很好 - 即它生成一副纸牌,我使用的是 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";
    }
}

It works well for me - i.e. it generates deck of cards, I'm using perl 5.8.8.

But. Using glob for this seems to be strange - I mean - sure, it's possible, but glob is a tool to match files which is not guaranteed to actually check for the files, but nobody says that it will not match the files in the future!

I would definitely go with another approach. For example like this:

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;

Or, if you find the map{map} too cryptic:

my @deck;
for my $card ( @cards ) {
    for my $color ( @colors ) {
        push @deck, "$card$color";
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文