Посмотрите документацию для open()
- все функции dup()
могут быть выполнены с помощью open
- например ::
open(my $fh2, '<&=', $fh1); # makes $fh2 a dup of file handle $fh1
С другой стороны, я думаю, что вы можете достичь своей цели, проводя различие между дескрипторами чтения и дескрипторами записи. То есть, в вашем коде не используйте один и тот же дескриптор сокета для чтения и записи - используйте разные переменные / члены / параметры экземпляра для указания дескриптора чтения и дескриптора записи. Пример - вместо:
sub foo {
my ($sock) = @_;
my $x = <$sock>;
...
print {$sock} ...;
}
напишите свой код так:
sub foo {
my ($rh, $wh) = @_;
my $x = <$rh>; # use $rh for reading
...
print {$wh} ...; # use $wh for writing
}
Тогда, если вы действительно можете использовать тот же сокет, вы звоните foo
с foo($sock, $sock)
.
Однако, если вы хотите использовать два разных сокета, вы можете сделать это с помощью foo($s1, $s2)
.