(私のソースではない)の問題をデバッグしようとしています。実際に私が挿入したキーと値のペアかどうかを調べる
ソケットを作成するためのIO::Socket
のラッパーであるパッケージを作成しました。
use warnings;
use mysock::my_sock;
sub new {
my $var = mysock::my_sock->new({
ip => '10.109.157.249', # Hard coded IP
port => '2002', # Hard coded port
reuse => 1,
eol =>''
}) or die "unable to connect $!\n";
return var;
} # This sub will go to another package, putting it here for brevity.
my $box = new();
上記のコードは単純です:私が呼ぶとき
package mysock::my_sock;
use strict;
use warnings;
use Scalar::Util 'refaddr';
use IO::Socket;
use IO::Select;
my %socket;
my $dbg_flag = 0;
our ($obj,$sel,$eol);
sub new {
my $class = shift;
my $args = shift;
my $sock = new IO::Socket::INET(%{$args});
my $obj = bless \do {my $anon_scalar}, class; # <-- Added.
if (!$sock) { warn "Cannot create socket: $!/[email protected]\n" if ($dbg_flag);
return undef;
}
my $sel = new IO::Select($sock);
if(!sel){ warn "Could not create select obj: $!/[email protected]\n" if ($dbg_flag);
return undef;
}
# Initialize some vars for class
$socket{ refaddr $obj }->{_SOCKET_} = $sock;
$socket{ refaddr $obj }->{_SELECT_} = $sel;
$socket{ refaddr $obj }->{_EOL_} = $eol;
$socket{ refaddr $obj }->{_BUFFER_} = {};
return $obj;
}
1;
は今/私のスクリプトで罰金の作品このように、すべてを自分のパッケージを使用しています。私は正常にソケットハンドルを作成しました。 Noこれまでのところ問題があります。
しかし、私は、IPアドレスとポートを渡すことができるように私は私のスクリプトに私の新しい機能をこのように変更すると、私はそれは私が何をするかに関係なく動作させることはできません。
sub new {
my ($ip_, $port_) = @_;
my @AoH = (
{
reuse => 1,
eol =>''
}
);
$AoH[0]{ip} = $ip_ ; #insert key => value to my AoH
$AoH[0]{port} = $port_ ; #insert key => value to my AoH
my $var = mysock::my_sock->new($AoH[0]) or die "unable to connect- $!\n";
return $var;
}
my $box = new('10.150.180.245','2011'); # pass ip/port as args.
私は渡してみましたmy $var = mysock::my_sock->new($AoH)
またはmy $var = mysock::my_sock->new($AoH)
、さらにはmy $var = mysock::my_sock->new(\@AoH)
である。これらの作品はありません。
私は私が私のパッケージの中に入る$args
をダンプすると、両方のケースのために、それはハッシュを出力します。
$VAR1 = {
"reuse" => 1,
"ip" => "10.63.122.49",
"port" => 6002,
"eol" => ""
};
私はperlのデバッガを使用しています、と私はどちらか私のスクリプトを実行したときに、それは上記と同じハッシュを示していますそれは私を混乱させるものです。それらが同じ場合、なぜ2番目の方法は機能しませんか?
ハッシュが何らかの形で書かれましたか?私は何が間違っているのか分からない。私のパッケージの$sock
はソケットを取得せず、IO::Socket
を返すことができませんでした。私が変更された関数を使ってパラメータを渡すと、undef
が返されます。
お手伝いできますか?
をハッシュリファレンスを取得することができますよう、あなたがコンパイルすることを不可能にする、あなたの最初のコードブロックのタイプミスがあり、
refaddr
を使用する必要がないということです。ここではコードを再入力せず、実際のコードをコピー/貼り付けてください。 – simbabque質問が分かりません。あなたは配列の最初の要素を渡しています。それはあなたの参照です。'new'メソッドで' $ args'に入れます。 IO :: Socketオブジェクトを作成するときに、それをリストに逆参照します。それはすべて見事に見える。あなたがそのハッシュリファレンスにIPとポートを入れる方法は問題ありませんが、うまくいきます。 '{reuse => 1、eol => q {}、port => $ port、ip => $ ip}'のようにするだけです。しかし、それは本当に違いはありません。 – simbabque
「動作させることができません」と「動作しません」は問題の説明ではありません。 [mcve]を投稿してください。 – melpomene