-2

私はperlが初めてです。私の動機は、txt ファイルから値を読み取り、それを perl スクリプトで使用することです。

テキストファイルは次のようなものです::

Servers ::              
   (local)

      Tomas-Server1

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

私がする必要があるのは、3 行目の値 (Tomas-Server2) を取得し、それを私の perl スクリプトで使用することです。基本的に、perl スクリプトの 3 番目の値を呼び出します。

私はそれのための基本的なコードを書きました::

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」値を使用しようとすると、何も返されません。含まれる値は「(ローカル)」である必要があると思います。

4

2 に答える 2

1

サンプルデータにはいくつか問題がありますが、あなたがやろうとしていることは理解していると思います。3 番目のサーバーの値 (3 行目だけでなく) が必要であると仮定すると、おそらく次のようなコードが必要になるでしょう...

#!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

これが問題に対処する最良の方法ではないことは認めますが、ほとんどの Perl ハックと同様に機能します。コードが少しやり過ぎで、一部の操作にデータを渡す前に検証チェックを行っていることに気付くでしょう。使用する言語でこれを行う習慣を身につけてください。これにより、問題が発生したときにより意味のあるエラーを返すのに役立ち、データ関連の問題をキャッチします。サンプル コードでは、先頭と末尾が後で問題を引き起こす可能性があるため、データのクリーンアップも少し行います。空行 (クリーニング後) も削除されます。

ところで、例として使用したデータ ファイルは次のようになります...

Servers ::              
   (local)

      Tomas-Server1 
      Tomas-Server2  

      Tomas-Server3
      Tomas-Server4

      Tomas-Server5

      Tomas-ServerLast
于 2013-10-07T21:46:09.000 に答える