1
#!/usr/bin/perl -w

use strict;
use File::Copy;
use File::Spec;

my($chptr, $base_path, $new, $dir);

$dir = "Full Metal Alchemist"; #Some dir

opendir(FMA, $dir) or die "Can't open FMA dir";
while($chptr = readdir FMA){
$base_path = File::Spec->rel2abs($dir).'/'; #find absolute path of $fir
if($chptr =~ m(Chapter\w*\d*)){ #some regex to avoid the .. and . dirs
    $new = join(" 0", split(/\W/, $chptr)); #modify said sub directory
    rename "$base_path$chptr", "$base_path$new" ? print "Renames $base_path$chptr to
    $base_path$new\n" : die "rename failed $!";
    }
}
closedir FMA;

もともと、私のスクリプトは移動操作を実行するために相対パスのみを使用していましたが、何らかの理由で、これによりサブディレクトリは影響を受けません。私の次のステップは、絶対パスに行くことでしたが、役に立ちませんでした。私はPerlを学んでいるので、単純な間違いを犯しているように感じます. どこで間違ったのですか?ティア

4

1 に答える 1

1

次のように.andを除外できます。..

if ( $child ne '.' and $child ne '..' ) { ... }

一般的な注意事項:

  • 自分がやりたいことの非常に明確な仕様を常に持ってください。それはまた、あなたを助けようとしているすべての人を助けます。
  • ここで何がうまくいかないのかは明らかではありません。正規表現が、一致させたいディレクトリと単に一致しないのではないでしょうか? 何が問題ですか?
  • 非常に具体的な部分 (処理を開始したいディレクトリの名前など) をパラメータにするようにしてください。明らかに、何をどのように名前変更するかなど、いくつかの詳細をパラメーターにするのがより困難です。
  • opendirreaddirrenameおよびを使用すると、File::Spec開始に問題ありません。ただし、より簡単な方法があります。Path::Classモジュール、特にその 2 つのサブクラスを見てください。これらは、巧妙に作成された抽象化レイヤーFile::Spec(およびそれ以上) を提供し、基本的にファイルシステム操作のワンストップ サービスです。
于 2012-05-20T08:41:13.043 に答える