1

Perl は初めてで、私の制限は苛立たしいものです。どんな助けでも大歓迎です。

スクリプトの作成:

  1. ファイルを入力し、テスト パターンの一致を解析します
  2. 特定の一致した単語を変数に出力する
  3. 変数に対して外部 Windows プログラム (nslookup) を実行し、
  4. テスト パターンの一致について nslookup の出力を解析する
  5. 特定の一致した単語を変数に出力する
  6. 2 つの変数の間で置換を実行する
  7. そして、変更されたテキストをファイルに出力します

「This is a Machine: ford.com test」をinput.txtファイルにエコーする

次のメッセージを受け取り続けるため、印刷に問題があります

test21.pl 行 38 の void コンテキストでの文字列の無用な使用。
非公式の回答: 初期化されていない値 $_ の使用が test21.pl 行 39 の出力で使用されています。

0

#!/bin/perl
use strict;
use warnings;
use Net::Nslookup;
use File::Copy;

sub host {
    my $result;
    my $node = shift;
    print system("nslookup $node.com | findstr ^Name: >> POOH");
    open( my $stuff, "<", "POOH" ) || die "Can't open input.txt: $!";
    while (<$stuff>) {
        if (/(Name:)(\s+)(\w+)/) {
            $result = $3;
        }
    }
    return $result;
}

my $captured;
my $captured2;
my $jeff;
my $in   = 'input.txt';
my $out  = 'output.txt';
my $test = 'test.txt';

copy( $in, $out ) || die "File cannot be copied.";
open OUTPUT, "< $out"  || die "Can't open input.txt: $!";
open TEST,   "> $test" || die "Can't open input.txt: $!";

while (<OUTPUT>) {    # assigns each line in turn to $_
    if (/(Machine:)(\s)(\w+)/) {
        $captured = $3;
        $jeff     = host($captured);
    }

    "s/$captured/$jeff/g";
    print TEST;

}
4

2 に答える 2

0

「s/$captured/$jeff/g」を引用符で囲む必要はありません。2 番目の問題については、ファイル ハンドラーに出力する内容をより明確にします。例 print TEST $_

于 2013-08-21T19:24:44.900 に答える
0

皆さんの推薦に感謝します。whileループを使用してコード行を変数に入力した後、デフォルトのスカラー変数を保存するように指示するコードを見つけました。そうすることで、面倒なコーディングを大幅に省くことができます。これが機能するコードです。

#!E:/Perl/bin/perl
use strict;
use warnings;

sub host {
    my $result;
    my $node = shift;
    print system("nslookup $node.com | findstr ^Name: >> LOOKUP");
    open(my $stuff,  "<",  "LOOKUP") || die "Can't open input.txt: $!"; 
    while (<$stuff>) { 
       if ( /(Name:)(\s+)(\w+)/ ) {
       $result = $3;
       }
   }
   return $result;
}

my $captured;
my $jeff;


open INPUT, '<', 'input.txt' || die "Can't open input.txt: $!";
open OUTPUT, '>', 'output.txt' || die "Can't open input.txt: $!";

while (<INPUT>) {     # while loop inputs each line of input.txt file
  my($line) = $_; 
  if ( /(Machine:)(\s)(\w+)/ ){ 
  $captured = $3; 
  $jeff = host($captured); 
  $_ = $line; 
  $line =~ s/$captured/$jeff/g; 
  print OUTPUT $line; 
  }
}

close OUTPUT;
close INPUT;
于 2013-09-04T01:37:58.013 に答える