変数のスコープを理解し、Perl で変数を適切に宣言しようとしていますが、苦労しています。
以下のコードは基本的に、Excel ファイルを読み込んで解析し、新しい Excel ファイルに出力します。
ただし、ヘッダーの 1 つを読み取ろうとしています。ヘッダーが文字列と一致する場合は、その列番号を記録し、後でコードで使用したいと考えています。
「./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();