私はPerlで小さなスクリプトを作成しましたが、これは本当に初めてです。与えられた引数を見て、与えられた引数にディレクトリツリーを作成するスクリプトがあるはずです。スクリプトのこの部分は機能します。2番目の部分(ネストされた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");
-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/...
、後で柔軟性を持たせます。もちろん、名前を入力するだけでもかまいませんが、それはばかげた間違いを招く傾向があります。
私が使用ファイル::パスのディレクトリを作成します。のようmkdir -p
にパス全体を構築し、{ }
エラー処理など、渡すことができる他のいくつかの便利なオプションがあります。他のモジュールもあります。たとえば、Path :: Tinyとそのmkpath
(および他の多くの機能)。
chdirを使用すると、現在の作業ディレクトリを記録し、それが返され、エラーをチェックする必要があることに注意してください。しかしchdir
、他に理由がなければ、そうする必要はありません。$dir
名前をに含めるだけですmap
# No chdir needed here
my @dirs = map { "$dir/Data/$_" } qw(Image Cache);
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加