我运行的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上。
答案 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中输入以查看它是否支持此功能。