스프레드시트::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이 아직 정의되지 않은 것을 알게 됩니다.

  • 내 의견으로는 이 프로그램은 비대화형이 더 나을 것입니다. 두 개의 이름을 요청하고 하나를 무시하는 대신 사용할 파일의 이름을 인수로 사용할 수 있습니다.

관련 정보