我正在使用 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;
}
$workbook
您可以通过在第一个 之前声明 as 来获得您正在寻找的作用域if
,my $workbook
然后在if
orelsif
块内对其进行赋值,而不声明新变量 ( $workbook = $parser->parse ...
)。
还有一些事情:
我建议编写条件代码,以明确您的变量肯定会被分配,因此
if (c) { $w = e } elsif (c') { $w = e' }
我会编写 ,而不是if (c) { $w = e } else { $w = e' }
。您可以调用 perl as
perl -w
和 adduse strict;
来接收有关常见错误的更好警告;特别是,这会迫使您声明每个变量,并且会发现$workbook
最后一个if
子句中的 the 尚未定义。在我看来,这个程序最好是非交互式的:它可以只将要使用的文件名作为参数,而不是要求两个名称并忽略一个。