一兩件事我注意到...
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
的價值?這是真實問題在這裏。
Somewhere $dst_dir
and $dst_pattern
is being set。這是您將FTP中的文件替換爲這些字符串的地方。然後我注意到這一點:
$dst_dir1 = eval($dst_dir);
$dst_file = eval($dst_pattern);
看來,$dst_dir
和$dst_file
是某種形式的命令?爲什麼還要用eval
在其上運行?這兩個字符串的值是什麼?爲什麼通過eval
運行?
發生了什麼是這兩個命令的字符串爲$&
,並且您正在替換該文件。我們假設$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);
}
我看到另一個問題。你正在循環每個文件,並且每次替換$dst_dir
和$dst_pattern
中的$&
。但是,如果你正在爲每個文件執行此操作,並且沒有重置$dst_dir
和$dst_pattern
的原始值,那意味着你第二次經過你的循環,你不會改變$dst_dir
和$dst_pattern
。而且,所有其他時間你也要經歷你的循環。
您還沒有檢查以確保替換實際上有效,並且您沒有檢查eval
是否通過檢查[email protected]
的值來檢查。
最重要的是,你沒有設置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 ("[email protected]") {
die qq(Evaluation of `$dist_dir` failed!: [email protected]);
}
$dst_file1 = eval($dist_pattern);
if ("[email protected]") {
die qq(Evaluation of '$dist_pattern' failed!: [email protected]);
}
}
這是檢查,以確保置換工作,並且還節約每次不修改您的模板。
但是$&之前沒有$ _,所以它沒有引用上述 –
'$&'只是'$ foo'中的文本文本,它正在被替換。 – Barmar
@LukeMakk - 由於正則表達式中的反斜槓,'$&'不被視爲Perl特殊變量,而僅僅被視爲字符序列。 '$ _'與這裏發生的事情無關(除了可能在$ foo中)。 –