我已经整理了一个定义变量的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
之外使用。
答案 0 :(得分:1)
我很难理解你问题中的代码,主要是因为所有的大写字符串;标识符和注释
大多数语言(包括Perl)中的本地标识符通常使用小写字母,数字和下划线_
编写。大写字母是为全局变量保留的,而在Perl的情况下,大多数是包(类)名称
重要变量的标识符使用大写字母,以便从其他变量中脱颖而出;但在您的示例中,大多数标识符都是大写字母。如果每个标识符表明它非常重要,那么理解代码结构是很困难的
我仔细查看了您展示的代码,并尽最大努力重新组织和简化它,使其更清晰,并按照我的想法行事。我已经为你的代码示例中未声明的所有变量添加了声明,并添加了我认为正确的结束括号}
以平衡语法以便编译
正如其他人所知,第二个条件子句测试下划线后跟两个空格将永远不会被执行,因为前面的下划线测试后跟一个空间将已经抓住了那个案子。使用单独的模式匹配来确定替换s///
是否成功也是没有意义的,因为替换单独不执行任何操作并且如果没有匹配则返回 false 值
目的是帮助您编写您可以理解的Perl代码,以及您可能寻求帮助的其他人(如Stack Overflow),或者可以帮助您维护软件
use strict;
use warnings;
my ($progressbar, $line_count);
my ($datafile, $ftpbase, $short, $tiff_dl_location);
my ($throttlelvl, $debuglvl);
my @input;
## Variables
my $filename = $input[0];
open my $info, $datafile or die "can't open <$datafile> for reading $!";
{
while (<$info>) {
chomp;
my ($filename, $permit) = split /:/;
my $filesize = -s "$tiff_dl_location/${permit}_${filename}";
my $short_permit = substr $permit, 0, 2;
### DEBUG ONLY ###
print "$filename / $permit / $ftpbase/$short_permit/$permit/$filename\n";
my $file_path = "/PATH/TO/DATA/$short_permit/$permit/$filename";
my $ftp = Net::FTP::Throttle->new(
"example.com",
MegabitsPerSecond => $throttlelvl,
Debug => $debuglvl
) or die "Cannot connect: $@";
$ftp->login(qw/ anonymous anonymous /) or die "Cannot login: ", $ftp->message;
$ftp->binary or die "Unable to set binary mode ", $ftp->message;
if ($progressbar == 1) {
print "\n[$./$line_count] Downloading $filename\n";
my $remote_filesize = $ftp->size($file_path);
if (not defined $remote_filesize) {
warn "=> File does not appear to exist on FTP server\n";
warn "=> Attempting to fix now\n";
$filename =~ s/_\s+/, /g;
$remote_filesize = $ftp->size($file_path);
if (not defined $remote_filesize) {
warn "=> ALL ATTEMPTS TO RESOLVE THE ISSUE HAVE FAILED.\n";
next;
}
}
print "File name: $filename\n";
# --- snip snip - more data, not relevant ---
}
}
}
答案 1 :(得分:0)
在条件块之前(之前)声明变量,除非它们仅在条件块{}内部使用。
另外, 用严格; 使用警告;