Hallo Community,
ich suche eine Alternative zu substr() um einen binären String Byteweise
in einer Schleife zu verarbeiten. Was mir an substr() nicht gefällt ist,
dass der $string jedesmal an substr() übergeben wird, lieber wäre es
mir, wenn ich den String "irgendwohin gebe" und den String dann in
8 Byte Häppchen zurück bekomme. Gibt es eine andere Möglichkeit?
Hier mein Codebeispiel mit substr():
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
use strict;
use warnings;
use Storable;
package Parent;
sub run {
my $pipe = shift;
# der zu sendende String
my $string = 'Hello World!';
$string = Storable::nfreeze(\$string);
my $length = length($string);
# maximale Bytes die geschrieben werden sollen
my $maxbyt = 8;
my $offset = 0;
my $rest = $length;
my $sdsz = $length < $maxbyt ? $length : $maxbyt;
open my $fh, '>>', $pipe or die $!;
while (my $chunk = substr($string, $offset, $sdsz)) {
syswrite($fh, $chunk, $sdsz) == $sdsz or die;
$rest -= $maxbyt;
last unless $rest;
$offset += $maxbyt;
$sdsz = $rest if $rest < $maxbyt;
}
close $fh;
}
package Child;
sub run {
my $pipe = shift;
my $rdsz = 8;
my $string = ();
open my $fh, '<', $pipe or die $!;
while (my $byt = read($fh, my $chunk, $rdsz)) {
die unless $byt == $rdsz;
$string .= $chunk;
}
close $fh;
$string = Storable::thaw($string);
print "\n<$$string>\n";
}
package main;
use POSIX qw/mkfifo/;
my $pipe = int(rand(999999));
mkfifo($pipe, 0600) or die;
if (fork) {
Parent::run($pipe);
} else {
Child::run($pipe);
unlink($pipe);
}
Gruss,
opi\n\n
<!--EDIT|opi|1183376728-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.