【发布时间】:2014-07-19 09:09:48
【问题描述】:
我一直在编写一个定义变量的 Perl 脚本,然后通过 if 语句为变量分配一个新值。
我想使用 if 语句中的最后一个赋值,并在 if 之外的其他地方完全引用它。
似乎在引用它时它使用了原始值。
代码如下:
## VARIABLES
my $FILENAME = $input[0];
open my $info, $DATAFILE or die "can't open <$DATAFILE> for reading $!";
{
while (my $line = <$info>) {
chomp $line;
my @input = split(':', $line);
chomp(@input);
$FILENAME = $input[0];
$PERMIT = $input[1];
$FILESIZE = -s "$TIFF_DL_LOCATION/$PERMIT\_$FILENAME";
$SHORT_PERMIT = substr($PERMIT, 0, 2);
### DEBUG ONLY ###
print "$FILENAME / $PERMIT / $FTPBASE/$SHORT_PERMIT/$PERMIT/$FILENAME\n";
my $ftp = Net::FTP::Throttle->new(
"example.com",
MegabitsPerSecond => $THROTTLELVL,
Debug => $DEBUGLVL
) or die "Cannot connect: $@";
$ftp->login("anonymous", 'anonymous') or die "Cannot login ", $ftp->message;
$ftp->binary or die "Unable to set binary mode ", $ftp->message;
if ($PROGRESSBAR eq 1) {
print "\n[$./$LINE_COUNT] Downloading $FILENAME\n";
my $REMOTE_FILESIZE = $ftp->size("/PATH/TO/DATA/$SHORT_PERMIT/$PERMIT/$FILENAME");
if (!defined($REMOTE_FILESIZE)) {
print "=> FILE DOES NOT APPEAR TO EXIST ON FTP SERVER\n";
if ($FILENAME =~ m/_\s/) {
print "=> ATTEMPTING TO FIX NOW\n";
$FILENAME =~ s/_\s/, /g;
$REMOTE_FILESIZE = $ftp->size("/PATH/TO/DATA/$SHORT_PERMIT/$PERMIT/$FILENAME");
if (!defined($REMOTE_FILESIZE)) {
print "=> FAILED!\n";
}
}
elsif ($FILENAME =~ m/_\s\s/) {
print "=> ATTEMPTING TO FIX NOW\n";
$FILENAME =~ s/_\s\s/, /g;
$REMOTE_FILESIZE = $ftp->size("/PATH/TO/DATA/$SHORT_PERMIT/$PERMIT/$FILENAME");
if (!defined($REMOTE_FILESIZE)) {
print "$FILENAME\n";
print "=> FAILED!\n";
}
}
else {
print "=> ALL ATTEMPTS TO RESOLVE THE ISSUE HAVE FAILED.\n";
next;
}
}
$REMOTE_FILESIZE = $ftp->size("/PATH/TO/DATA/$SHORT_PERMIT/$PERMIT/$FILENAME");
print "FILENAME: $FILENAME\n";
--- SNIP SNIP - MORE DATA, NOT RELEVANT--
我得到的输出是最初打开的文件的名称,而不是 if 语句中的替换修改后的值。
这是错误更正:它检查从文件中获取的文件名,如果匹配,它会更正它,最后,我有一个旧变量 $FILENAME 和一个我想要的新值在if之外使用。
【问题讨论】:
-
也许我误解了这个问题,但我没有看到任何 $FILENAME 被重新分配的代码。如果您希望更改 $FILENAME 的值,那么我希望在原始分配之外的代码中的某处看到“$FILENAME = ...”。相反,我只看到 $FILENAME =~ 这是一个搜索绑定运算符,完全不同。
-
您可能有错字。把'使用严格;'和“使用警告;”在脚本的顶部。它会警告您在不同范围内重新定义的变量。
-
@drewrockshard 您是否尝试在 ' $FILENAME =~ s/_\s/, /g;' 之前和之后打印 $FILENAME在 if/elsif 块中检查是否确实存在替换或 if/elsif 块谓词是否满足。
-
我同意 keety。 '$FILENAME =~ m/_\s\s/' 永远不会被匹配,因为它总是首先匹配 '$FILENAME =~ m/_\s/'。
-
@drewrockshard:我已经编辑了您的问题,使其更具可读性。请检查以确保它符合您的意图
标签: perl variables if-statement scope