Perl 在已知非扩展名时识别文件名扩展名的有效方法

Perl 在已知非扩展名时识别文件名扩展名的有效方法,perl,Perl,这是我目前的代码-目录中有一个名为cover的文件-扩展将是浏览器通常显示的任何有效图形格式。我可以做一个目录列表,去掉包含父节点和子节点的结果,然后使用剩余的结果,但这似乎是一种非常详细的方法。。。有没有人有更快的方法?我想通配符在某种程度上被使用。。。非常感谢 对于那些感兴趣的人,感谢第一个答案,我的最终解决方案是: my $cover="/******/gamebooks/Accounts/$Author/MyBooks/$Book/images/cover/cover.jpg";

这是我目前的代码-目录中有一个名为cover的文件-扩展将是浏览器通常显示的任何有效图形格式。我可以做一个目录列表,去掉包含父节点和子节点的结果,然后使用剩余的结果,但这似乎是一种非常详细的方法。。。有没有人有更快的方法?我想通配符在某种程度上被使用。。。非常感谢

对于那些感兴趣的人,感谢第一个答案,我的最终解决方案是:

    my $cover="/******/gamebooks/Accounts/$Author/MyBooks/$Book/images/cover/cover.jpg";
if(-e $cover){
    $cover=$uri->encode("https://fightingfantasy.net/gamebooks/Accounts/$Author/MyBooks/$Book/images/cover/cover.jpg");
}
else{
    # print "$cover not found";
    $cover="$perl_scriptlocation/resources/images/beholder.jpg";
}

这比我了解glob之前的唯一选择更令人满意多谢是的,我知道它可以被剥去2到3条线条,仍然有些优雅,但我还没有

我不确定我是否真的理解你的问题。但是我假设你有一个基本名称,例如picture,并且想要有一个扩展名,假设这样的文件存在,例如picture.jpg,picture.png。。。在这种情况下,glob将有助于:

    my $coverbase="/******/gamebooks/Accounts/$Author/MyBooks/$Book/images/cover/cover";
    my $cover = glob qq("${coverbase}.*");

    if(-e $cover){
        $cover=~/.*\/(.*)/i;
        $coverfile=$1;
        $cover=$uri->encode("https://fightingfantasy.net/gamebooks/Accounts/$Author/MyBooks/$Book/images/cover/$coverfile");
    }
    else{
        # print "$cover not found";
        $cover="$perl_scriptlocation/resources/images/beholder.jpg";
    }

我不确定我是否真的理解你的问题。但是我假设你有一个基本名称,例如picture,并且想要有一个扩展名,假设这样的文件存在,例如picture.jpg,picture.png。。。在这种情况下,glob将有助于:

    my $coverbase="/******/gamebooks/Accounts/$Author/MyBooks/$Book/images/cover/cover";
    my $cover = glob qq("${coverbase}.*");

    if(-e $cover){
        $cover=~/.*\/(.*)/i;
        $coverfile=$1;
        $cover=$uri->encode("https://fightingfantasy.net/gamebooks/Accounts/$Author/MyBooks/$Book/images/cover/$coverfile");
    }
    else{
        # print "$cover not found";
        $cover="$perl_scriptlocation/resources/images/beholder.jpg";
    }

我想这正是我想要的——我会努力的it@Beeblbroxglob确实不能使用空格,如果你有它的话。添加使用文件::Glob':bsd_Glob';在顶部和glob将尊重名称中的空格。这种标量上下文可能会很危险,因为它会迭代,而且非常全局。也许可以添加一个注释来说明这一点?@Beeblbrox By hazard在我上面的评论中,我的意思是,如果你不知道这个上下文,它可能会悄悄地做一些出乎意料的事情。所以如果你说如果我的$f=glob。。。{…}这是在某种循环中,代码不会每次都检查您拥有的一个文件,但它会在第一次返回其名称,然后在下一次返回一个undef,除非实际上还有更多的文件,在这种情况下,它会一个接一个地返回这些名称……不要在标量上下文中调用glob,而不会耗尽迭代器!修正了。我想这正是我想要的——我会试试的it@Beeblbroxglob确实不能使用空格,如果你有它的话。添加使用文件::Glob':bsd_Glob';在顶部和glob将尊重名称中的空格。这种标量上下文可能会很危险,因为它会迭代,而且非常全局。也许可以添加一个注释来说明这一点?@Beeblbrox By hazard在我上面的评论中,我的意思是,如果你不知道这个上下文,它可能会悄悄地做一些出乎意料的事情。所以如果你说如果我的$f=glob。。。{…}这是在某种循环中,代码不会每次都检查您拥有的一个文件,但它会在第一次返回其名称,然后在下一次返回一个undef,除非实际上还有更多的文件,在这种情况下,它会一个接一个地返回这些名称……不要在标量上下文中调用glob,而不会耗尽迭代器!注意:标量上下文中的glob迭代条目列表。因此,如果这段代码每次都在某种类型的循环中,它将返回下一个文件,直到没有更多的文件返回undef为止。这是一个功能,但你需要小心。例如,在列表上下文中,当分配给数组时,它只返回所有条目。my$cover=glob qq${coverbase}.*;应该是我的$cover=glob qq${coverbase}.*;//if-e$cover{是错误的;如果glob不匹配,$cover是未定义的。它应该是ifdefined$cover{.始终使用严格;使用警告。谢天谢地,它不在一个循环中,只在脚本中需要一次。我会考虑一下undef-现在它似乎可以很好地工作,即使它是undef?是的,严格和警告-嗯,在这种情况下,我的整个网站都会崩溃。注意:标量上下文中的glob在条目列表上迭代。所以如果这段代码每次返回下一个文件时都处于某种循环中,直到不再返回undef为止。这是一项功能,但您需要小心。例如,在列表上下文中,当分配给数组时,它只返回所有条目。my$cover=glob qq${coverbase}.*;应该是my$cover=glob qq${coverbase}.*;///if-e$cover{是错误的;如果glob不匹配,$cover是未定义的。它应该是ifdefined$cover{。始终使用严格;使用警告。谢天谢地,它不在循环中,只在脚本中需要一次。我会考虑一下undef-现在它似乎工作得很好,即使它是undef?是的,严格和警告-嗯,在这种情况下,我的整个网站都会崩溃