• ベストアンサー

意図しないところに改行が入ってしまいます。

perlでping scriptを作成しているのですが結果のメールがうまく整形できません。 どこが悪いのかわかりません。 もしおわかりでしたら教えていただけませんか? host.txtのファイルの中身はできれば(2)のようにしたいのですがそのように書くと 改行されおかしな格好になってしまいます。 結果的に(1)のように出力させたいのですが内容は(2)のように書きたいのです。 ちなみに(1)のように書けば思ったとおりの結果になります。 しかし対象マシン増えるとわかりずらくなってしまうのでできれば一行ずつ改行させたいのです。 (1)host.txt 192.168.0.2:192.168.0.3:192.168.0.4:192.168.0.5 結果 192.168.0.2 is down (2)host.txt 192.168.0.2: 192.168.0.3: 192.168.0.4: 192.168.0.5: 結果 192.168.0.2 is down ####CGI#####以下ソースです。 #!/usr/bin/perl -w use Net::Ping; open (IN,"host.txt"); @host = <IN>; close (IN); @list = split( /:/ , "@host" ); my $sendmail = '/usr/sbin/sendmail'; $ii = @list; $timeout=1; $pObj = Net::Ping->new("icmp"); for ((my $i)=0; $i<$ii;$i++){ if($pObj->ping($list[$i], $timeout)){ print "$list[$i] is running.\n"; } else{ open(SENDMAIL,"| $sendmail -t -i"); print SENDMAIL "From:alert\@domain\n"; print SENDMAIL "To:test\@domain\n"; print SENDMAIL "Cc:\n"; print SENDMAIL "Subject: [test]$list[$i] is down.\n"; print SENDMAIL "$list[$i] is down.\n"; close(SENDMAIL); } } $pObj->close();

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

原因としては、改行した時の区切りが":"ではなくで":\n"になっていることです。 なので、 @list = split( /:\n/ , "@host" ); のようにすることで、改行を含まないように切り分けることができます。 しかし、(2)の場合最後の行にも":改行"がついているので、空白のデータが1つできてしまいます。なので、最後の行には":"を付けるべきではありません。 しかしながら、もともと、":"による区切りは、一行でアドレスを並べて書くために必要だったもので(2)の形式で書く場合には、そもそも、もう一度連結する必要がありません。 なので、(2)の形式に変更するなら ":"は、不要なので、削除して open (IN,"host.txt"); @host = <IN>; close (IN); のあと @list = split( /:/ , "@host" ); を chomp (@list =@host); に置き換える様にすれば良いです。

gahau
質問者

お礼

BLUEPIXYさん 思い通りの結果を得ることができました。 どうもありがとうございました。

その他の回答 (1)

  • taseki
  • ベストアンサー率66% (155/233)
回答No.2

ANo.1の方の補足になりますが、 そもそも配列を二重引用符の中に書くと、「スペースでつなげた一つの文字列」になります。 print "@host"; とやってみると解ると思います。 なので、結果的に各アドレスが、コロン、改行、スペース、という3文字によって区切られた一つの文字列になっています。 これを @list = split( /:/ , "@host" ); としても、「改行、スペース、アドレス」の配列になってしまいます。 そもそも、 @host = <IN>; を実行した時点で、「アドレス、コロン、改行」の配列になっているので、 foreach (@host) { tr/\n\r://d; } @list = @host; (本来 @list は不要) などとすれば良いですが、しかし、改行で区切られているのだからコロンは不要ではないでしょうか。 host.txtの内容を ------------- 192.168.0.2 192.168.0.3 192.168.0.4 192.168.0.5 ------------- として、 open (IN,"host.txt"); @host = <IN>; close (IN); foreach (@host) { chomp; } で、@host の中に全アドレスが入ります(@list は使わない)。

gahau
質問者

お礼

tasekiさん わざわざ丁寧に補足していただいてありがとうございました。 二重引用符の中の話、とても役に立ちました。

関連するQ&A