0

私のコードは次のようになります。

#!/usr/bin/perl -w
use strict;
use warnings;

my $i = 1;
my @old_names = glob "/root/pics/*.jpg";
my $new_name = "picture$i";

foreach my $old_name (@old_names) {
    rename($old_name, $new_name) or 
        die "Couldn't rename $old_name to $new_name: $!\n";
} continue { $i++ }

スクリプトを実行すると画像が削除されますが、何が間違っていますか?

編集:

これが私のために働いたものです。

#!/usr/bin/perl -w
use strict;
use warnings;

my $i = 1;
my @old_names = glob "/root/pics/*.jpg";


foreach my $old_name (@old_names) {

    my $new_name = "picture$i" . ".jpg";

    rename($old_name, "/root/pics/$new_name") or die "Couldn't rename $old_name to $new_name: $!\n";

} continue { $i++ }

みんな助けてくれてありがとう。

4

4 に答える 4

5

この行:

my $new_name = "picture$i";

あなたのループの外にあります。したがって、更新されません。そのため、すべてのファイルの名前が同じ名前に変更され、効果的に削除されます。

解決策は、割り当てをループ内に移動する、変数をすべてスキップして実行することです

rename($old_name, "picture$i") ...

ゴルフの目的のために、あなたも考慮するかもしれません

rename($old_name, "picture" . $i++) ...

コアモジュールであるFile::Copyもチェックしてみてください。

于 2012-10-19T19:50:43.620 に答える
1

$new_nameループの外で一度初期化しました。更新しても、更新$iしていません$new_name。したがって、すべてのファイルの名前がpicture1(現在のディレクトリにある) に変更され、最後のファイルを除くすべてが失われます。

ループ内を更新$new_nameします。

foreach my $old_name (@old_names)
{
    $new_name = "picture$i";
    ...
}
于 2012-10-19T19:52:37.170 に答える
0

試す:

#!/usr/bin/perl -w
use strict;
use warnings;

my $i = 1;
my @old_names = glob "/root/pics/*.jpg";
my $new_name = "picture$i";

foreach my $old_name (@old_names)
{
    $new_name = "picture$i";
    rename($old_name, $new_name) or die "Could not rename $old_name to $new_name: $!\n";
    $i++;
}
于 2012-10-19T19:53:47.023 に答える
0

たぶん、シェルで(バックグラウンドで使用して)行うことができますperl

rename 's/(.*).jpg/picture1_\1/' *.jpg
于 2012-10-19T19:57:20.967 に答える