2013-10-07 2 views
-2

나는 perl을 처음 사용합니다. 내 동기는 txt 파일에서 일부 값을 읽고 내 펄 스크립트에서 사용하는 것입니다.값이 파일에 저장되지 않았습니다. <Perl>

텍스트 파일은 다음과 같이 ::이다

Servers ::    
    (local) 

     Tomas-Server1 

     Tomas-Server2 
     .........** 

내가 뭘해야 할 것은 3 선 값 (토마스 - 서버 2)를 얻을 내 펄 스크립트를 사용하는 것입니다. 기본적으로 perl 스크립트에 대한 세 번째 값 호출.

my($ServName1,$ServName,$ServName3) = getservername($servername); 
my ($filenam) = 'data.txt'; 
my @Param =(); 

open(INFILE,"<$filenam") or die "Couldn't open $filenam for reading\n"; 
while(<INFILE>) { 
    chop($_); 
    push(@Param,$_); 
} 
close(INFILE); 
return @Param; 
} 

을 ::하지만 난이 "$ ServName2"값을 사용하려고 할 때, 그것은 아무것도 반환되지 않습니다 내가 기본적인 코드를 작성했습니다. 나는 그 값이 "(local)"이어야한다고 생각한다.

+0

나는 당신이 어딘가에 첫 번째 줄 이후 내 @Param'전에'서브 getservername {'행을 포함하는 것을 잊었다 생각 =();'. – jwodder

+0

그건 3 라인이 아니야. 그것이 7 행입니다. 그 정보가 정말로 필요합니까? 파일을 구문 분석하는 방법을 묻지 않는 것 같습니다. – TLP

+1

모든 파일의 상단에'use strict;'를 포함해야합니다. –

답변

1

예제 데이터에는 몇 가지 문제점이 있지만 사용자가하려는 것을 이해하고 있다고 생각합니다.

#!perl 

#some includes 
use strict; 
use warnings; 
use Data::Dumper; 

#set some vars 
my $TargetFileName="data_file.txt"; 
my $TargetServerNumber=3; 

#call the sub 
my @ServerArray=GetServerName($TargetFileName); 

#did we get anything back? 
if(@ServerArray) { 
    #yep, we got some content 
    print "Server number ".$TargetServerNumber."/".($#ServerArray+1)." is \"".$ServerArray[$TargetServerNumber-1]."\"\n"; #array numbers are 0-based 
} else { 
    #nope, we read the file but didn't any matching content 
    print "No servers found in file \"".$TargetFileName."\".\n"; 
} #end if 

print "\n"; 
print "Here's what was loaded into \@ServerArray...\n"; 
print Data::Dumper::Dumper(@ServerArray); #so you can see the full content of @ServerArray 
print "All Done\n"; 
exit; 

#----- subs go here ----- 

sub GetServerName { 
    my $DataFileName=shift; #pull in the first arg - this alters @_ for the rest of the sub, so take care when doing this 
    my @ReturnArray; 
    #do some QA 
    if(!$DataFileName) {die "You need to provide a file name to use this sub.\n"} #do we have a file name? 
    if(!stat($DataFileName)) {die "The requested file name of \"".$DataFileName."\" does not exist.\n";} #does the file exist? 
    open(INFILE, "<".$DataFileName) or die "Unable to open \"".$DataFileName."\" - ".$!; 

    #ok, read the file content 
    while(my $Line=<INFILE>) { 
     chop($Line); 
     $Line=~s/^\s+//g; #remove leading white spaces 
     $Line=~s/\s+$//g; #remove trailing white spaces 
     if(!$Line) {next;} #blank line, skip it 

     #check for the headers 
     if($Line=~m/^Servers/) {next;} #skip lines beginning with "Servers" 
     if($Line=~m/^\(local\)/) {next;} #skip lines beginning with "(local)" 

     #if we get here, we must want the line content, so add it to the array 
     push(@ReturnArray, $Line); 
    } #end while 
    close(INFILE); 

    #send the array data back, if any 
    return @ReturnArray 
} #end GetServerName sub 

__END__ 

stuff below here does not need to be commented 

나는이 문제를 접근하는 가장 좋은 방법이 아니다 인정 ... 세 번째 서버 값을 원하는 (뿐 아니라 라인 # 3) 당신은 아마 이런 식으로 뭔가를 보이는 코드를 갖고 싶어한다고 가정하면 ,하지만 대부분의 펄 해킹과 마찬가지로 작동합니다. 코드가 조금 과장되어 일부 작업에 데이터를 전달하기 전에 유효성 검사를 수행합니다. 작업하는 모든 언어에서이 작업을 수행하는 습관을 갖습니다. 이로 인해 작업이 잘못 될 경우보다 의미있는 오류를 반환하는 데 도움이됩니다. 데이터 관련 문제를 포착하십시오. 선행 및 후행으로 인해 나중에 문제가 발생할 수 있으므로 샘플 코드는 약간의 데이터 정리를 수행합니다. 빈 라인 (클리닝 후)도 제거됩니다. BTW

, I는 다음과 같이 예제로 사용되는 데이터 파일 ...

Servers ::    
    (local) 

     Tomas-Server1 
     Tomas-Server2 

     Tomas-Server3 
     Tomas-Server4 

     Tomas-Server5 

     Tomas-ServerLast 
1

$ServName2 변수를 정의하지 마십시오. $ServName1$ServName3 사이의 변수는 숫자가없는 $ServName으로 명명됩니다.

관련 문제