【问题标题】:Can I use a Perl constant in the glob operator?我可以在 glob 运算符中使用 Perl 常量吗?
【发布时间】:2009-05-06 20:13:21
【问题描述】:

我正在解析 XML 文件,例如:

while (<files/*.xml>) { ... }

我想对“文件”使用一个常量,比如说

use constant FILES_PATH => 'files';
while (<FILES_PATH/*.xml>) { ... }

我希望你理解这个想法,并能帮助我:)..

提前谢谢你。

【问题讨论】:

    标签: perl constants glob


    【解决方案1】:

    嗯,这是使用Readonly 而不是常量的原因之一。您可以在常量的开头使用&amp; 或在结尾使用() 来让Perl 意识到它是子程序。让我检查一下。

    不,但是您可以使用创建 arrayref 的经典技巧来取消引用:

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    
    use constant DIR => "/tmp";
    
    print map { "$_\n" } <${[DIR]}[0]/*>;
    

    但由于glob "*"&lt;*&gt; 相同,您可能更喜欢:

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    
    use constant DIR => "/tmp";
    
    print map { "$_\n" } glob DIR . "/*";
    

    我可能会说

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    
    use Readonly;
    
    Readonly my $DIR => "/tmp";
    
    print map { "$_\n" } <$DIR/*>;
    

    【讨论】:

    • 如此完整,但我没有可用的只读模块 :(.. 将仅使用 glob 选项。
    • Readonly 在 CPAN 上,搜索如何在您的操作系统上设置 CPAN,或者,如果您使用 Linux,请查看您的发行版中可用的软件包(Readonly 很可能已为您打包) .在 Ubuntu 中,它被命名为 libreadonly-perl
    【解决方案2】:

    正如其他人所说,这都是关于字符串插值的。

    常量 pragma 在插值上下文中失败,因此您必须使用可行的方法。

    如前所述,只读是一种选择。

    您还可以使用旧的“将只读值分配给 typeglob 技巧”。

    our $FILES_PATH; # declare FILES_PATH scalar to keep strict happy.
    *FILES_PATH = \'files';  # Assign to typeglob so $FILES_PATH points to a string literal  
    
    while( <$FILES_PATH/*.xml> ) {
        # read the files
    }
    

    【讨论】:

      【解决方案3】:

      在这种情况下,“/”肯定会被视为除法,而且不太可能去任何地方。我认为您可能需要退后一步,看看您还有哪些其他选择。我认为您正在尝试进行“文件通配”,尽管我不记得细节,但我似乎记得 perl 对此的支持。 CPAN 中有一个“Glob”模块,您可能想查看它。就个人而言,我会更加行人,只需使用 DirHandle 并使用“下一个 ... 除非 ...”行过滤掉非 xml 文件。

      【讨论】:

      • 不,如果 的内容不是文件句柄,则将其视为双引号字符串,因此 / 没有特殊含义。这也是为什么你不能只使用常量(常量不插值),但旧的解引用-匿名-数组-到-包含-函数-调用有效。 opendir+readdir+grep+closedir 是一个有效的答案,但通常 glob 更易于阅读(特别是如果您使用 Readonly 而不是常量 pragma)。
      猜你喜欢
      • 2021-09-11
      • 2018-07-25
      • 2023-03-15
      • 1970-01-01
      • 2017-10-23
      • 1970-01-01
      • 2010-10-06
      • 1970-01-01
      • 2010-10-18
      相关资源
      最近更新 更多