Leser: 22
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
#!/usr/bin/perl use strict; use warnings; my $path = '/media/sdb1/frames/neu/frames_20mb.dat'; my ($x, $y, $u, $z, $un) = 0; my $count = 10000000; my $HEADER = "\xff\xd8"; my $FOOTER = "\xff\xd9"; open my $dh, '<', $path; my $data = do {local $/; <$dh>}; my $RE_match_four_bytes = qr<\x55\x88[\x00-\x0b]\x10>; while ($data =~ m/($RE_match_four_bytes)/g) { ($x, $y, $u, $z) = split ("", $1); $un = ord($u); if ( $data=~ m/($HEADER.*?$FOOTER)/sg) { my $image = $1; $count++; my $image_name = "/media/sdb1/frames/new/$un/cam.$un.$count.jpg"; open my $fh, "> $image_name"; print $fh $image; } } close $dh;
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
#!/usr/bin/perl use strict; use warnings; my $path = '/media/sdb1/frames/neu/frames_20mb.dat'; my $dest = '/media/sdb1/frames/new/%u/cam.%u.%08u.jpg'; my $HEADER = "\xff\xd8"; my $FOOTER = "\xff\xd9"; my $RE_match_four_bytes = qr<\x55\x88([\x00-\x0b])\x10>; my $data=''; { open( my $dh, '<', $path ) or die("ERROR open $path ($!)\n"); local $/; # binäres lesen, keine Umwandulung von zeichen. binmode($dh); $data =<$dh>; close($dh); } # Man kann reguläre Ausdrücke nicht verschachteln # und hoffen die Positionen im String erhalten bleiben. # Jede neue Regexp setzt die Positionen im String zurück. # man muss ein Match also in einer Regexp unterbringen, # oder man benutzt die spezial Variable $' die alles nach einem Match enthält. # Der Nachteil ist aber, dass das Script dadurch langsamer wird # und viele Daten kopiert werden müssen. my $count = 0; while ($data =~ m/$RE_match_four_bytes.*?($HEADER.*?$FOOTER)/g) { my $un = ord($1); my $image = $2; $count++; my $image_name = sprintf($dest,$un,$un,$count); if(open(my $fh, '>', $image_name)) { print $fh $image; close($fh); } else { warn("ERROR save $image_name ($!)\n"); } }
1
2
3
4
$ perl -e 'my $var = "test\ntest"; my ($treffer1) = $var =~ /(.*)/; my ($treffer2) = $var =~ /(.*)/s; print ">>$treffer1<<\n<<$treffer2>>"'
>>test<<
<<test
test>>