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
if
첫 번째 범위와 같이 선언 한 my $workbook
다음 새 변수( )를 선언하지 않고 if
or 블록 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
이 아직 정의되지 않은 것을 알게 됩니다.내 의견으로는 이 프로그램은 비대화형이 더 나을 것입니다. 두 개의 이름을 요청하고 하나를 무시하는 대신 사용할 파일의 이름을 인수로 사용할 수 있습니다.