如何在Perl中正确声明全局变量?

Jim*_* P. 9 perl

我试图理解变量范围并在Perl中正确声明变量,我很难过.

下面的代码基本上读取一个excel文件,解析它,然后将它吐出到一个新的excel文件中.

但是,我试图读取其中一个标题,如果标题与我的字符串匹配,我想记录该列号,并在稍后的代码中使用它.

我在./parser.pl第38行打印出"使用未初始化的值$ site_name_col".

第38行是"print $ site_name_col;"

我意识到这个print语句在最初初始化变量的{}之外,但它在代码的开头被声明为一个全局变量,那么是什么给出了?

#!/usr/bin/perl -w

use strict;
use warnings;
use vars qw($site_name_col);
use Spreadsheet::WriteExcel;
use Spreadsheet::ParseExcel;

my ($fname1) = @ARGV;

my $parser   = Spreadsheet::ParseExcel->new();
my $workbook = $parser->parse($fname1);

my $new_workbook = Spreadsheet::WriteExcel->new('formated_list.xls', $fname1);

if (!defined $workbook) {

    die $parser->error(), ".\n";
}

for my $worksheet ( $workbook->worksheets() ) {

    my ($wsheet_name) = $worksheet->get_name();
    my $new_worksheet = $new_workbook->add_worksheet($wsheet_name);  

    my ($row_min, $row_max) = $worksheet->row_range();
    my ($col_min, $col_max) = $worksheet->col_range();

    for my $row ($row_min .. $row_max) {

        for my $col ($col_min .. $col_max) {

            my $cell = $worksheet->get_cell($row, $col);
            next unless $cell;

            print "Row, Col = ($row, $col)\n";

            if ( $cell->value() =~ /Site Name/ ) {

                $site_name_col = $col;
            }
            print $site_name_col;

            $new_worksheet->write($row, $col, $cell->value());
        }
    }
}

$new_workbook->close();
Run Code Online (Sandbox Code Playgroud)

Des*_*nov 5

use vars qw()不建议再做了.声明全局变量使用our $my_var 您的问题可能来自条件$cell->value() =~ /Site Name/.它可能永远不会遇到,所以你的变量永远不会得到一个值.