Perl - 使用if语句中的变量

时间:2014-05-29 18:34:55

标签: perl variables if-statement scope

我已经整理了一个定义变量的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之外使用。

2 个答案:

答案 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)

在条件块之前(之前)声明变量,除非它们仅在条件块{}内部使用。

另外,     用严格;     使用警告;