我想编写一个接收文件和目录路径的Perl脚本, 该目录包含指向其他目录的链接的文件。 我想逐个查看目录中的文件, 并且对于每个文件,在我的输入文件中搜索文件名,并将其替换为链接到
的地址例如,如果脚本收到目录"/myworkspace/mydir"
它包含以下文件:
myfile1 -> /myworkspace/globaldir/file1
myfile2 -> /myworkspace/somedir/file2
myfile3 -> /globalworkspace/file3
比以下输入文件:
" cd /myworkspace/mydir/myfile1
cp -r /myworkspace/mydir/myfile2 /myworkspace/mydir/myfile3 "
我想得到以下输出:
" cd /myworkspace/globaldir/file1
cp -r /myworkspace/somedir/file2 /globalworkspace/file3 "
这样做的有效方法是什么?
答案 0 :(得分:2)
我使用Path::Tiny来处理绝对路径和路径连接。
#!/usr/bin/perl
use warnings;
use strict;
use Path::Tiny;
my $dir = shift;
my $input = shift;
my %replace;
opendir my $DIR, $dir or die $!;
while (my $file = readdir $DIR) {
$file = path($dir)->child($file)->absolute;
$replace{$file} = readlink $file if -l $file;
}
close $DIR;
my $regex = join '|',
map quotemeta, # To handle filenames containing "." etc.
sort { length $b <=> length $a } # Not to replace parts of paths (process longer first).
keys %replace;
open my $IN, '<', $input or die $!;
while (<$IN>) {
s/($regex)/$replace{$1}/g;
print
}