0

これが私の目標です:

  1. 特定のファイルを見つけて保存する

    a) フォルダ名

    b) フルパスのファイル名

  2. ファイルごとに、ファイル名とフォルダー名を使用してファイル内の 2 つのテキスト文字列を置き換え、結果を配列に書き込みます (後でファイルに書き込みます)。

私のforeachループが機能していないため、明らかに何かが欠けています。

use strict;
use warnings;
use diagnostics;
use File::Find::Rule;
use File::Spec;
use File::Basename;
use Cwd;
my $dir = cwd;
my $command_template = 'Here is my Filepath: file and this is the Folderpath: folder';
my $search_file = 'test.txt';
my @files = File::Find::Rule->file()
                ->name($search_file)
                #->maxdepth(2)
                ->in($dir);
my @command_files;
foreach (@files){
    my $directories = dirname ($_);
    $command_template =~ s/file/$_/g;
    $command_template =~ s/folder/$directories/g;
    push(@command_files,$command_template,"\n");
}
print "@command_files";
open COMMAND_FILES, '>command_files.txt' or die "Can't open COMMAND_FILES: $!\n";
print COMMAND_FILES @command_files;

問題はここにあります:

foreach (@files){
        my $directories = dirname ($_);
        $command_template =~ s/filepath/$_/g;
        $command_template =~ s/folder/$directories/g;
        push(@command_files,$command_template,"\n");
    }

私が設定した場合

@files = qw/ c:\1\test.txt c:\2\test.txt c:\2\1\test.txt /;

ただし、すべて @command_files に書き込まれます。

Here is my Filepath: c:\1\test.txt and this is the Folderpath: c:\1
Here is my Filepath: c:\1\test.txt and this is the Folderpath: c:\1
Here is my Filepath: c:\1\test.txt and this is the Folderpath: c:\1

私が欲しい:

Here is my Filepath: c:\1\test.txt and this is the Folderpath: c:\1
Here is my Filepath: c:\2\test.txt and this is the Folderpath: c:\2
Here is my Filepath: c:\2\1\test.txt and this is the Folderpath: c:\2\1

foreach ループが配列 @files の最初のコンテンツのみをもたらすのはなぜですか?

4

1 に答える 1

2

$command_template置換で変更します。2回目のループでは一致しません。

$command_templateループ内でのコピーを作成し、を実行します$copy =~ s/filepath/$_/g

于 2013-03-27T19:58:49.580 に答える