PerlスクリプトのIFステートメントの実行に小さな問題があります。

あぶみ骨

私は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]

編集
0

コメントを追加

0

関連記事

分類Dev

ajaxの実装に問題があります。ステートメントが機能しない場合

分類Dev

INSERTINTOステートメントでCOUNTの実行に問題があります

分類Dev

ifステートメントのロジックに問題があります

分類Dev

whileおよびifステートメントがスクリプトに問題がありますか?

分類Dev

ケース内のヒアドキュメントに問題があります。Bashスクリプト

分類Dev

空のセット結果が表示され続けましたが、クエリステートメントに問題がありますか?

分類Dev

ダーツのifステートメントに問題があります

分類Dev

ifステートメントのブール値に問題があります

分類Dev

javaScriptのifステートメントに問題があります

分類Dev

Mayaの起動時にPythonスクリプトを実行するのに問題があります

分類Dev

予期しないステートメントの始まり-構文に問題がありますか?

分類Dev

bashスクリプトを実行可能にするのに問題があります

分類Dev

elseステートメントをwhileループで出力するのに問題があります

分類Dev

docker:dockerはrootとして実行されるため、node.jsアプリケーションのインストールに問題があります

分類Dev

更新ステートメントを機能させるのに問題があります

分類Dev

各ステートメントがコレクションにクラッシュしたデータベースのプロパティ値の取得が変更されました列挙操作が実行されない場合があります

分類Dev

このコードのifステートメントの後にjavaスクリプトループが実行されないのはなぜですか?

分類Dev

jQuery を使用してウェイポイントを取得できません (html でのスクリプトの実行に問題があります)

分類Dev

テストの実行に関する問題(<androidx.test.ext.junit.runners.AndroidJUnit4>にはゼロ引数コンストラクターがありません)

分類Dev

非常に単純なperlスクリプトには大量のメモリリークがあります

分類Dev

while ループの前に if ステートメントを明示的に実行する必要がありますか?

分類Dev

アスタリスクダイヤルプランAGIスクリプトが実行されない(アスタリスク権限の問題の可能性がありますか?)

分類Dev

このPowerShellスクリプトのdowhileステートメントの何が問題になっていますか?

分類Dev

PostgreSQLステートメントの何が問題になっていますか?これはMySqlで実行されます

分類Dev

SQLRookieがMySQLで1つのSQLステートメントを取得するのに問題があります

分類Dev

即時ステートメントの実行で「文字列トークン」のように使用する一重引用符に問題がある

分類Dev

アプリを実行するたびにこの問題に直面します。java.lang.NoClassDefFoundError:ブートクラスローダーを使用してクラスが見つかりません。利用可能なスタックがありません

分類Dev

ブートストラップ-小さなデバイスにのみ行があります

分類Dev

Googleスクリプトでifステートメントがtrueの場合、Elseステートメントは引き続き実行されます

Related 関連記事

  1. 1

    ajaxの実装に問題があります。ステートメントが機能しない場合

  2. 2

    INSERTINTOステートメントでCOUNTの実行に問題があります

  3. 3

    ifステートメントのロジックに問題があります

  4. 4

    whileおよびifステートメントがスクリプトに問題がありますか?

  5. 5

    ケース内のヒアドキュメントに問題があります。Bashスクリプト

  6. 6

    空のセット結果が表示され続けましたが、クエリステートメントに問題がありますか?

  7. 7

    ダーツのifステートメントに問題があります

  8. 8

    ifステートメントのブール値に問題があります

  9. 9

    javaScriptのifステートメントに問題があります

  10. 10

    Mayaの起動時にPythonスクリプトを実行するのに問題があります

  11. 11

    予期しないステートメントの始まり-構文に問題がありますか?

  12. 12

    bashスクリプトを実行可能にするのに問題があります

  13. 13

    elseステートメントをwhileループで出力するのに問題があります

  14. 14

    docker:dockerはrootとして実行されるため、node.jsアプリケーションのインストールに問題があります

  15. 15

    更新ステートメントを機能させるのに問題があります

  16. 16

    各ステートメントがコレクションにクラッシュしたデータベースのプロパティ値の取得が変更されました列挙操作が実行されない場合があります

  17. 17

    このコードのifステートメントの後にjavaスクリプトループが実行されないのはなぜですか?

  18. 18

    jQuery を使用してウェイポイントを取得できません (html でのスクリプトの実行に問題があります)

  19. 19

    テストの実行に関する問題(<androidx.test.ext.junit.runners.AndroidJUnit4>にはゼロ引数コンストラクターがありません)

  20. 20

    非常に単純なperlスクリプトには大量のメモリリークがあります

  21. 21

    while ループの前に if ステートメントを明示的に実行する必要がありますか?

  22. 22

    アスタリスクダイヤルプランAGIスクリプトが実行されない(アスタリスク権限の問題の可能性がありますか?)

  23. 23

    このPowerShellスクリプトのdowhileステートメントの何が問題になっていますか?

  24. 24

    PostgreSQLステートメントの何が問題になっていますか?これはMySqlで実行されます

  25. 25

    SQLRookieがMySQLで1つのSQLステートメントを取得するのに問題があります

  26. 26

    即時ステートメントの実行で「文字列トークン」のように使用する一重引用符に問題がある

  27. 27

    アプリを実行するたびにこの問題に直面します。java.lang.NoClassDefFoundError:ブートクラスローダーを使用してクラスが見つかりません。利用可能なスタックがありません

  28. 28

    ブートストラップ-小さなデバイスにのみ行があります

  29. 29

    Googleスクリプトでifステートメントがtrueの場合、Elseステートメントは引き続き実行されます

ホットタグ

アーカイブ