我注意到一件事...
for $file ( $ftp -> ls() )
{
$bar = file;
这应该是$bar = $file
而不是$bar = file
(您的脚本缺少前导$
)file
。否则,您只是将字符串file
放入$bar
.
你表达的另一部分是:
$dst_dir =~ s/\$\&/\$bar/g; #so this is replacing \$\& with $src
$dst_pattern =~ s/\$\&/\$bar/g;
$dst_dir
和的值是$dst_pattern
多少?这才是真正的问题。
某处$dst_dir
并且$dst_pattern
正在被设置。这是您将 FTP 中的文件替换为这些字符串的地方。然后我注意到这一点:
$dst_dir1 = eval( $dst_dir );
$dst_file = eval( $dst_pattern );
似乎是$dst_dir
某种$dst_file
命令?为什么还要eval
在它们上面运行?这两个字符串的值是多少?为什么要通过 运行它们eval
?
发生的事情是这两个命令中包含字符串$&
,并且您正在用您正在 ftp'ing 的文件替换该字符串。
假设$dst_dir
等于$ftp->get("$&")
。您从$ftp->ls
命令中获得的文件名(假设它bar.txt
被替换为该字符串。因此,$dst_dir1
设置为$ftp->get("bar.txt");
.
并查看整个循环:
for $file ( $ftp -> ls() )
{
$bar = file;
$dst_dir =~ s/\$\&/\$bar/g; #so this is replacing \$\& with $src
$dst_pattern =~ s/\$\&/\$bar/g;
$dst_dir1 = eval( $dst_dir );
$dst_file = eval( $dst_pattern );
}
我看到另一个问题。您正在遍历每个文件并每次都替换$&
in 。但是,如果您对每个文件都执行此操作,并且您没有重置and的原始值。这意味着您第二次通过循环时,您不会更改and 。而且,在所有其他时间里,你也会经历你的循环。$dst_dir
$dst_pattern
$dst_dir
$dst_pattern
$dst_dir
$dst_pattern
您也没有检查以确保替换确实有效,并且您没有eval
通过检查$@
.
最重要的是,您没有设置use strict;
,也可能没有use warnings;
。
这是循环的新版本:
for my $file ( $ftp->ls ) {
my $dist_dir = $dst_dir; # Make sure you don't futz with your
my $dist_pattern = $dst_pattern; # original templates!
# Check to make sure replacements work!
if ( not $dist_dir =~ s/\$\&/\$file/g ) {
die qq(Couldn't put file name "$file" into "$dist_dir");
}
if ( not $dist_pattern =~ s/\$\&/\$file/g ) {
die qq(Couldn't put file name "$file" into "$dist_pattern");
}
# Check for Eval!
my $dst_dir1;
my $dst_file1;
$dst_dir1 = eval( $dist_dir );
if ( "$@" ) {
die qq(Evaluation of `$dist_dir` failed!: $@ );
}
$dst_file1 = eval( $dist_pattern );
if ( "$@" ) {
die qq(Evaluation of '$dist_pattern' failed!: $@);
}
}
这是检查以确保替换有效,并且还可以节省每次都修改模板。