2012-08-06 2 views
1
에서 "스칼라 씹는에서 초기화되지 않은 값의 사용은"

나는 아래의 오류 : 사람이

Use of uninitialized value $user in scalar chomp at ./temp.pl line 38, <DATA> line 558. 
Use of uninitialized value $modelName in scalar chomp at ./temp.pl line 39, <DATA> line 558. 
Use of uninitialized value $Application in scalar chomp at ./temp.pl line 40, <DATA> line 558. 
Use of uninitialized value $user in string eq at ./temp.pl line 42, <DATA> line 558. 

에 나를 도울 수 코드는 다음과 같이, 누군가가 나를 도울 수있다 이것에 :

my ($user) = $ARGV[0]; 
my ($modelName) = $ARGV[1]; 
my ($Application) = $ARGV[2]; 

chomp($user); 
chomp($modelName); 
chomp($Application); 

if (($user eq "") || ($modelName eq "") || ($Application eq "")) { 
    &usage; 
} 

sub usage { 
    print "\tUsage : $0 User ModelName Application\n"; 
    exit (1); 
} 

답변

3

이 프로그램은 매개 변수를 기대 - 사용자, 모델 이름 및 응용 프로그램 - 명령 줄을 당신이 아무도에게 제공되지 않은 통과 chomp 값으로 필요가 없습니다

이 새로운 라인에 끝이 없을 것 같은 명령 줄에서

코드는 더 나은 당신이 당신의 프로그램을 실행할 때 입력 명령 행에서 세 개의 매개 변수를 가정하는이

usage() unless @ARGV == 3; 

my ($user, $modelName, $Application) = @ARGV; 
+0

감사합니다.하지만 여전히이 오류가 발생합니다. ./temp.pl 줄 39에 문자열 이퀄라이저에서 초기화되지 않은 값 $ user를 사용합니다. Chomp를 제거했습니다. – pauler

+0

방금 ​​시스템에서 코드를 보았습니다. './temp.pl U M A'로 호출하면 오류나 경고 메시지가 표시되지 않습니다. 스크립트 상단에'#!/usr/bin/perl'을 추가했습니다. 덧붙여 말하자면,'usage()'는'& usage' 함수를 호출하는 더 좋은 방법입니다. –

+0

@pauler : 내 코드는 당신을 대체합니다. 여전히 오류 코드가 있으므로 아직 실패 중입니다 – Borodin

0

같이 기록됩니다. 그러나 프로그램에서 그렇게하는지 확인하는 것은 없습니다. 따라서 첫 번째 매개 변수가없는 경우 $ARGV[0]은 null이고 $user도 마찬가지입니다. chomp 사용자는 오류가 발생합니다.

use strict; 
use warnings; 

# Let's give some directions 

my $usage <<USAGE; 

    Usage: <program> <user> <model> <application> 

    All parameters are required! 

USAGE 

if (scalar @ARGV != 3) { 
    die "$usage"; 
} 

my $user =  shift; 
my $modelName = shift; 
my $Application = shift; 

# No need for this 

chomp $user; 
chomp $modelName; 
chomp $Application; 

주의 사항 몇 가지 : 여기에 프로그램의 약간 수정 된 버전입니다

  • 나는 use strictuse warnings 프라그 마를 있습니다. 항상 모든 프로그램에서 이것을 사용하십시오. 이 프로그램은 사람들이 프로그램에서 만드는 오류의 약 90 %를 발견하는 데 도움을줍니다.
  • 다른 조치를 취하기 전에 인수가 있는지 확인합니다. 나는 을 사용하여 @ARGV에 스칼라 값 (이 컨텍스트에서 어쨌든 할 수 있음)을 강제로 적용하고 실제로 3 개의 값만 있는지 확인합니다. 세 개의 값이 없으면 사용법 텍스트를 제공합니다.
  • 명령 줄 매개 변수를 chomp 할 필요가 없습니다. Chomping은 각 파일 줄이 EOL 문자 또는 문자로 읽혀지기 때문에 파일 입력에만 정말로 필요합니다. 주로 행이 공백 인 경우 <...>이 0을 리턴하지 않도록하기 위해 주로 수행됩니다. 행이 비어 있으면 적어도 하나의 NL 문자를 반환하는 <...>이 표시됩니다.

한가지 더 ...

나는 서브 루틴보다는 $usage 텍스트를 사용하고 싶다. 내 코드를 보는 사람이 볼 수있는 프로그램의 맨 위에 바로 사용 텍스트를 설정하고 프로그램 사용 방법을 정확히 읽습니다. 내 사용 텍스트를 die 문에 입력 할 수도 있습니다.

게다가 서브 루틴에서 아무 것도 출력하지 않는 것은 나쁜 형식입니다. 서브 루틴은 호출 프로그램이 작동 할 수있는 값을 반환해야합니다.

+0

감사합니다 데이비드, tht reallly 도움이됐다 .. 나는 UR 도움과 시간이 u에 보냈다 주셔서 감사합니다 .. 정말 고마워요 :) 나는 게시물을 통해 UR 지식을 얻을 수있었습니다. – pauler