【问题标题】:perl populating arrays with filenames from user defined directory?perl 用用户定义目录中的文件名填充数组?
【发布时间】:2013-06-20 16:52:55
【问题描述】:

我正在尝试使用用户定义目录中的文件名填充两个数组。如果文件位于我运行程序的同一目录中,则我到目前为止的代码有效。此代码的最终目标是使用脚本将文件从一种格式转换为另一种格式,并将新转换的文件导出到用户定义的目录中。

# Get export directory
my $export_dir = $ARGV[0]."\\";

print "Export Directory: \"$export_dir\"\n\n" if DEBUG;

# Get current working directory
my $cwd_dir =  getcwd;

# Replace slashes with back-slashes for Windows compatibility
$cwd_dir =~ s/\//\\/g;

print "Current Working Directory: \"$cwd_dir\"\n\n" if DEBUG;


# Get list of ZIP files in directory
my @zip_files = glob "*.zip";

当 zip 文件位于当前工作目录中时,此代码有效。如何让它在 zip 文件位于用户定义的目录中时工作? (在本例中为子文件夹,但应位于用户定义导出目录的任何位置)。

【问题讨论】:

  • 您不需要将斜杠 / 替换为反斜杠 \ 以使您的脚本与 Windows 兼容:Windows 理解路径中的斜杠。试试看。

标签: arrays perl glob populate


【解决方案1】:

只需将目录名称附加到 glob 规范:

my @zip_files = glob "$export_dir\\*.zip";

附:理想情况下,您应该使用 File::Spec CPAN 模块以独立于操作系统的方式构建文件路径,而不是硬编码 Windows 的 "\\" 和 Unix 的 "/"。

【讨论】:

  • 如果使用包含空格的路径,例如Documents and settings,则需要小心,因为它们不适用于 glob。
  • @TLP - 是的,File::Find 将是一个更可靠的解决方案
  • 谢谢大家,这似乎奏效了。现在唯一的问题是它会在以后造成更多问题。检查文件是否存在时,您是否也知道如何指定目录?我正在使用 if (-e $zip_file) 但它只检查当前目录而不是用户指定的目录。
  • 另外,感谢您指出使用此方法的目录不能有空格。我困惑了一段时间,因为它不起作用。我会研究一下 {Find::Find} 看看是否能找到其他方法。
  • @odoc 为什么你觉得需要检查文件是否存在?如果您刚刚创建了文件列表,它怎么可能不存在?如果您觉得在脚本运行时文件系统可能会被更改,您可能应该考虑使用迭代解决方案,例如 File::Find 或 while (readdir $dh)。
【解决方案2】:

你显然想要

my @zip_files = do { eval { chdir $export_dir } or die $!; my @x = glob "*.zip"; chdir $cwd_dir; @x };

或者,为了少一点矫枉过正(如果$export_dir 不是有效的目录,则返回空列表,

my @zip_files = eval { chdir $export_dir or die; my @x = glob "*.zip"; chdir $cwd_dir; @x };

【讨论】:

  • 这(恕我直言)不像不得不拉File::Spec(我承认这是一个可靠的解决方案)那么矫枉过正。 :D
  • 我指的是你可以简单地做glob "$export_dir/*.zip"。
  • 但是您说带空格的路径可能适用于 glob,也可能不适用于 glob。我所做的正是为了防止这种情况发生。
  • 是的,我希望你不会注意到这一点。 :) 您在这里所做的是使用非常繁重的武器库来解决有更合适工具的问题。事实上,这里根本不需要do 或eval。
猜你喜欢
  • 2011-07-08
  • 1970-01-01
  • 2016-08-31
  • 1970-01-01
  • 2018-04-22
  • 2013-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多