我在Perl中创建了一个小脚本,我对此非常陌生。我应该有一个脚本来查看给定的参数并在给定的参数中创建一个目录树。这部分脚本有效。第二部分(嵌套if语句)不会在您不提供参数时要求您输入所选目录。我认为嵌套的if语句由于$ file输入而搞乱,但我并不完全确定这是错误的。这可能是非常简单的事情,但我无法找到解决方案。提前感谢您的帮助和提示。
#! /usr/bin/perl
if ($#ARGV == -1)
{
print "Please enter default directory:";
my $file=<STDIN>;
if (-d $file)
{
chdir $file;
system("mkdir Data");
system("mkdir Data/Image");
system("mkdir Data/Cache");
print "Structure Created";
}
else
{
print "Directory does not exsist";
}
}
else
{
chdir $ARGV[0];
system("mkdir Data");
system("mkdir Data/Image");
system("mkdir Data/Cache");
print ("Structure Created");
}
print ("\n");
答案 0 :(得分:3)
测试-d $file
失败,因为通过STDIN
输入的内容在指定目录名称的字符串后面也有换行符。您需要chomp($file);
但是,我想提出几点意见。
最重要的是,两个分支都有重复的代码。你真的不想那样做。它可以而且确实会在以后造成麻烦。而是,决定目录名称,然后进行。
其次,没有理由为了制作目录而去系统。在Perl中做它会好得多,并且有很好的模块。
use strict;
use warnings;
use File::Path qw(make_path);
my $dir;
if (not @ARGV) {
print "Please enter default directory: ";
$dir = <STDIN>;
chomp $dir;
}
else {
$dir = $ARGV[0];
}
die "No directory $dir" if not -d $dir;
my $orig_cwd = chdir $dir or die "Can't chdir to $dir: $!";
my @dirs = map { "Data/$_" } qw(Image Cache);
my @dirs_made = make_path( @dirs, { verbose => 1 } );
print "Created directories:\n";
print "$_\n" for @dirs_made;
我使用map构建目录列表,以避免重复使用Data/...
字符串,以及以后的灵活性。你当然可以输入名字,但这往往会引起愚蠢的错误。
我使用File::Path制作目录。它构建整个路径,如mkdir -p
,并且还有一些其他有用的选项可以在{ }
中传递,包括错误处理。还有其他模块,例如Path::Tiny及其mkpath
(以及许多其他好东西)。
请注意,对于chdir,您可能希望记录当前工作目录,它返回,以及您要检查错误。但如果没有其他原因,您不必chdir
。只需在$dir
map
名称即可
# No chdir needed here
my @dirs = map { "$dir/Data/$_" } qw(Image Cache);