特定の反復後にコードを再帰サブルーチンからエスケープしたい
これは私のテストコードです:
#!/usr/bin/perl
use strict;
&sub();
my $count = 0;
sub sub
{
if ( $count lt 1 )
{
print "This statment is visible \n";
$count++;
&sub();
}
else
{
return;
}
}
これは以下の出力を提供し、私はそれに満足しています:
This statment is visible
しかし、を使用する#!/usr/bin/perl -w
と、出力が表示されますが、警告も表示されます。
Use of uninitialized value $count in string lt at sub.pl line 9.
This statment is visible
質問1:上記の警告を取り除く方法。
さて、上記のコードは私のテストコードであり、同じロジックを以下の実際のコードに適用したいと思います。
要するに、私はhostname
そのに解決したいと思いIP address
ます。それが機能しない場合は、にを追加してdomain name (.my.company.net)
からhostname
、名前の解決を試みます。
ただし、上記のコード(場合によっては、理由がわからない)は、無限の深い再帰に入り、メモリ全体を消費します。VMが応答しなくなり、VMを再起動して動作を再開する必要があります。
したがって、無限再帰を実行するのではなく、1回の反復後に再帰サブから解放したいと思います。
コードは次のとおりです。
#!/usr/bin/perl -w
use strict;
my $IP = to_ip("abcdefgh");
print $IP."\n";
my $count = 0;
sub to_ip
{
if ( $count lt 1 )
{
use Socket;
my $hostname = shift;
my $packed_ip = gethostbyname($hostname);
if ( defined $packed_ip )
{
sprintf inet_ntoa($packed_ip);
}
else
{
$hostname .= ".my.company.net";
to_ip($hostname);
}
$count++;
}
else
{
return;
}
}
Aobveコードは以下の警告を表示し、その後再びスタックします。VMを再起動して、元に戻す必要があります。
Useless use of sprintf in void context at get_deleted_list.pl line 98.
上記の警告の行番号は無視してください。それはsprintf
私のサブで参照しています
質問2: 1回の反復後にサブから抜け出す方法。サブから結果を取得するかどうかは気にしませんが、1回の反復後に結果を取得したいと思います。
ありがとう。