スプレッドシート::ParseExcel [閉じる]

スプレッドシート::ParseExcel [閉じる]

Spreadsheet::ParseExcelを使用しており、ユーザーからファイル名を入力したいと思います。また、ユーザーが提供した基準に基づいて両方のファイルを解析したいと思います。

これが私が書いたものです:

print("Enter the path of the file_y:");
$file_y=<STDIN>;
chomp($file_y);

print("Enter the path of the file_n:");
$file_n=<STDIN>;
chomp($file_n);

print("Enter whether file_y or file_n is required(y/n)?");
$yes=<STDIN>;
chomp($yes);

my $parser = Spreadsheet::ParseExcel->new();
if($yes eq "y")
{
    my $workbook = $parser->parse($file_y);
}
elsif($yes eq "n")
{
    my $workbook = $parser->parse($file_n);
}

if ( !defined $workbook ) {
    die $parser->error(), "Worksheet not defined.\n";

yes が y または n の値を取得しても、「シートが未定義」と印刷されます。

ベストアンサー1

キーワードはmyローカル変数を宣言します。したがって、$workbook次の本文の一部ですif

if($yes eq "y")
{
    my $workbook = 1;
}

$workbookif最初の範囲のように宣言し、my $workbook新しい変数()を宣言せずにiforブロックelsif内に割り当てることで、目的の範囲を取得できます$workbook = $parser->parse ...

いくつかの追加:

  • 変数が確実に割り当てられることを明確にするために、条件付きコードを記述することをお勧めします。したがって、代わりにif (c) { $w = e } elsif (c') { $w = e' }作成しますif (c) { $w = e } else { $w = e' }

  • Perl asを呼び出すことで、perl -w一般的なuse strict;エラーに関するより良い警告を受け取ることができます。特にこれを行うと、すべての変数を宣言する必要があり、$workbook最後のセクションifのまだ定義されていないことがわかります。

  • 私の意見では、このプログラムは非対話型の方が良いでしょう。 2つの名前を要求して1つを無視する代わりに、使用するファイルの名前を引数として使用できます。

おすすめ記事