1

私はperlを初めて使用し、IPが保存されているファイルを読みたいと思っています。これらのIPをgrepして配列に保存したいのですが、これの正規表現を書くことはできますが、3つのIPのうち、常にファイルの最後のIPを保存しますarray 、私のコードとファイルが以下のようなものである誰かを助けてください。

入力ファイルの内容は次のとおりです

こんにちは praveen お元気ですか 10.23.54.86

10.87.98.65

10.98.76.54

私のスクリプトo/pは

/pearl$ ./par.pl sdp.txt

10.98.76.54

コードは

#!/usr/bin/perl

open (INPUT,$ARGV[0]) || die "Can not open file:$!";

$i=0;

while(<INPUT>)
{
  $line=$_;
  ($arr,$arr1,$arr2)=($line=~m/\d+[\.]\d+[\.]\d+[\.]\d+/g);
}


close(INPUT);

print $arr,"\n";

配列と変数を試しましたが、同じ結果が最後の値のみを格納します。

4

3 に答える 3

2

一度に 1 行ずつ読み取っていて、各行には 1 つのアドレスしかないため、もちろん出力はループの後に出力され、各反復の内部では出力されないため、出力は 1 つしかありません。

  • 使用する<>
  • 不必要な変数を避ける (など$i)
  • 警告を有効にする
  • ほとんどの場合、配列を使用して IP を保存する必要があります

次のコードでは、IP は に保存され@ipsます。

#!/usr/bin/perl

use warnings;
use strict;

my @ips;

while (<>) {
    # not the optimal regex for IPs, I just simplifyied yours
    push @ips, m/(?:\d+\.){3}\d+/g;
}

print "@ips\n";
# --- or ---
print "$_\n" foreach @ips;
于 2012-11-06T13:43:31.520 に答える
1

この目的のために十分に開発されているため、Perl モジュールRegexp::Commonを使用して IP を一致させることを検討してください。

use strict;
use warnings;
use Regexp::Common qw/net/;

my @IPs;

while (<>) {
    my ($IP) = /($RE{net}{IPv4})/;
    push @IPs, $IP if $IP;
}

print "$_\n" for @IPs;

データセットからの出力:

10.23.54.86
10.87.98.65
10.98.76.54

回線上の有効な IP がキャプチャされ、 に配置され$IPます。次の行は、IP が含まれている場合にpushIP を指定します。最後に、 の要素があればそれが編集されます。@IPs$IP@IPsprint

お役に立てれば!

于 2012-11-06T16:41:33.033 に答える
0

次の 2 つの問題があるようです。

  1. 4 つではなく 3 つの変数を入力しているように見えます (最後の数字が必要ない場合を除きます)。

  2. 正規表現はキャプチャ グループを指定していないため、一致した文字列から値を保存していません。

次のようなものが必要です。

while(<INPUT>)
{
  if( ($arr,$arr1,$arr2,$arr3) = /(\d+)\.(\d+)\.(\d+)\.(\d+)/g )
  {
    print "$arr $arr1 $arr2 $arr3\n";
  }
}

または、一致した番号をリストとして扱いたい場合は、これを試してください:

while(<>)
{
  chomp;
  if( @array = /(\d+)\.(\d+)\.(\d+)\.(\d+)/g )
  {
    print @array;
  }
}
于 2012-11-06T13:36:25.677 に答える