运行Perl脚本时遇到通配符困难?

时间:2015-10-12 19:33:48

标签: perl

我运行的Perl脚本(MOSS, Measure of Software Similarity)将文件或文件夹上传到服务器,但我遇到了一些奇怪的行为。

这应该有效:

mossnet.pl -l java -d Files/*/*.java

然而,当我尝试这样做时,我告诉Files / / .java不存在(但它确实存在)。

但是,当我将其指向该目录中的特定文件时:

mossnet.pl -l java -d Files/foo/bar.java Files/foo2/bar2.java

它正常工作。因此,它能够看到目录结构,但它似乎在给出通配符时会跳闸。

有什么建议吗?

如果相关:我在PC,Windows 7上。

2 个答案:

答案 0 :(得分:3)

是的,与您在Windows上相关。 Windows shell中的通配符扩展是错误的,文档建议(并提供一种技术)来自己处理它们:

http://search.cpan.org/dist/perl-5.23.2/README.win32#Command-line_Wildcard_Expansion

  

DOS后代操作系统上的默认命令shell(例如它们)通常不会扩展提供给程序的通配符参数。他们认为应用程序的工作就是处理它。这通常通过将应用程序(在我们的示例中为perl)与C运行时库通常提供的启动代码相链接来实现。但是,这样做会导致perl版本不兼容(因为argv扩展代码的行为因编译器而异,并且在某些编译器上甚至有问题)。此外,如果您将这样的perl二进制文件与 扩展通配符的备用shell一起使用,则可能会令人感到沮丧。

     

相反,以下解决方案效果很好。关于它的好处是1)你可以马上开始使用它; 2)它更强大,因为它会使用像 / / * .c这样的模式做正确的事情。 3)您可以决定是否要使用它; 4)你可以扩展方法来添加任何自定义(甚至完全不同的通配符扩展)。

    # Wild.pm - emulate shell @ARGV expansion on shells that don't
    use File::DosGlob;
    @ARGV = map {
                  my @g = File::DosGlob::glob($_) if /[*?]/;
                  @g ? @g : $_;
                } @ARGV;
    1;

要使用此功能,您可以执行类似

的操作
    C:\> set PERL5OPT=-MWild
    C:\> mossnet.pl -l java -d Files/*/*.java

    C:\> perl -MWild mossnet.pl -l java -d Files/*/*.java

(或者你可以将上面的代码放在脚本的开头)

答案 1 :(得分:1)

路径中有多个通配符,例如

Files/*/*.java 
某些基本版本的Windows shell cmd.exe

可能不支持

您可能想尝试使用Power shell或其他一些像Cygwin这样的shell来实现此功能

尝试

dir Files/*/*.java

或其他一些命令,如ls或在shell中输入以查看它是否支持此功能。