1 2 3 4 5 6 7 8 9 10 11 12 13
my $string = 'abcijuwegwegwglwjgwgwhgwkgjnwgkjwngwnmgioghwoöighwghwgökwnglkwhgwohgwelökgnwgklweghgweghwelg,wngwehgwhgweoöhgwegnjwegnwegmwgega'; sub MAXSIZE { 13 }; my @parts = (); my $cur = 0; while ($cur < length($string)) { push @parts, substr($string, $cur, MAXSIZE); $cur += MAXSIZE; } say "@parts";
QuoteIch wäre nie auf die Idee gekommen, eine Konstante durch so eine Funktion auszudrücken
$hash{KONSTANTE()}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
use strict; use warnings; use 5.012; use constant TEST => 99; say TEST + 1; sub TOAST {99}; say TOAST + 1; say &TOAST + 100; __END__ ergibt 100 99 199
QuoteNun gibt es kein bestimmtes Zeichen nachdem ich splitten könnte.
Mein einziger Anhaltspunkt ist der - ich weiß, dass jedes Informationsfeld aus 160 Zeichen besteht.
Quote(Zahlen,Buchstaben,Leerzeichen).
2018-10-17T07:26:52 MuffiQuote(Zahlen,Buchstaben,Leerzeichen).
Seit wann sind Buchstaben Bytes?
2018-10-17T08:45:58 GwenDragonDas Einlesen von XX Bytes als XX Zeichen mit dem template A16 geht bei Unicode-Sequenzen aber schief.
Siehe https://perldoc.perl.org/perlpacktut.html#Unicode
Kommt eben drauf an was das wirklich für "Zeichen" sind.
my @entries = do { local $/ = \160; <$FH> }
Quoteist technisch nicht nur irrelevant sondern sogar falsch.160 Zeichen in einer Datei
Quotegerne auch weitere Ideen für alternative Lösungen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14
#! /usr/bin/perl use strict; use warnings; use 5.010; #my @parts = do { local $/ = \6; <DATA> }; my @parts = do { local $/; unpack "A6", <DATA> }; say ">$_<" for @parts; __DATA__ Hello World!
2018-10-17T10:47:24 rostiUnd eine einfache Prüfung, ob man die Schablone A160 verwenden kann, bestünde darin, festzustellen, ob die Dateien von der Länge her stets ein ganzzahliges Vielfaches von 160 sind.
2018-10-17T10:15:26 RaubtierDer Punkt ist doch, wenn du 160 Zeichen hast, dann können das auch mehr als 160 Bytes sein. Sobald die Zeichen in der Datei in einer variabel langen Kodierung wie UTF-8 oder UTF-16 gespeichert ist, kannst du eben nicht brutal 160 Bytes einlesen.
Es waren Umlaute im Beispielstring von Haselnuss992. Wir wissen nicht, wie das open-Kommando lautete, also ob da beispielsweise mit "<:utf8" geöffnet wurde. Wenn ich Buchstaben lese, würde ich nicht binär lesen.
Übrigens ist eine andere, meiner Meinung nach bessere Alternative, $/ zu setzen:
Code (perl): (dl )my @entries = do { local $/ = \160; <$FH> }
Wenn man eine Datei mit open my $FH, "<:utf8", "file" or die $!; öffnet, liest es 160 Zeichen einer UTF-8 kodierten Datei. Also je nach Modus beim Dateiöffnen.
2018-10-17T11:16:12 rostiSobald Du den Layer auf utf-8 schaltest, geht Deine Lösung übrigens in die Hose.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[13:48:33] ~/test$ cat a
12345678901234567890äöüäöüäöüäöüäöüäöüäö
[13:48:39] ~/test$ hexdump -C a
00000000 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 |1234567890123456|
00000010 37 38 39 30 c3 a4 c3 b6 c3 bc c3 a4 c3 b6 c3 bc |7890............|
00000020 c3 a4 c3 b6 c3 bc c3 a4 c3 b6 c3 bc c3 a4 c3 b6 |................|
00000030 c3 bc c3 a4 c3 b6 c3 bc c3 a4 c3 b6 0a |.............|
0000003d
[13:48:42] ~/test$ perl -MEncode -wE'open my $FH, "<:utf8", "a" or die $!; my @entries = do { local $/ = \5; <$FH> }; say encode_utf8($_) for @entries;'
12345
67890
12345
67890
äöüäö
üäöüä
öüäöü
äöüäö
1 2 3 4 5 6 7 8 9 10
my @u = do { local $/ = \2; <DATA>; }; print Dumper \@u; use utf8; __DATA__ €€€
1
2
3
4
5
6
7
8
9
10
11
12
13
14
utf8 "\xE2" does not map to Unicode at C:\Dokumente und Einstellungen\rolf\Desktop\pack.pl line 18, <DATA> chunk 1.
utf8 "\xAC" does not map to Unicode at C:\Dokumente und Einstellungen\rolf\Desktop\pack.pl line 18, <DATA> chunk 2.
utf8 "\x82" does not map to Unicode at C:\Dokumente und Einstellungen\rolf\Desktop\pack.pl line 18, <DATA> chunk 3.
utf8 "\xE2" does not map to Unicode at C:\Dokumente und Einstellungen\rolf\Desktop\pack.pl line 18, <DATA> chunk 4.
utf8 "\xAC" does not map to Unicode at C:\Dokumente und Einstellungen\rolf\Desktop\pack.pl line 18, <DATA> chunk 5.
Malformed UTF-8 character (2 bytes, need 3, after start byte 0xe2) in subroutine entry at C:/Perl/lib/Data/Dumper.pm line 207, <DATA> line 5.
Malformed UTF-8 character (unexpected continuation byte 0x82, with no preceding start byte) in subroutine entry at C:/Perl/lib/Data/Dumper.pm line 207, <DATA> line 5.
Malformed UTF-8 character (unexpected continuation byte 0xac, with no preceding start byte) in subroutine entry at C:/Perl/lib/Data/Dumper.pm line 207, <DATA> line 5.
Malformed UTF-8 character (1 byte, need 3, after start byte 0xe2) in subroutine entry at C:/Perl/lib/Data/Dumper.pm line 207, <DATA> line 5.
Malformed UTF-8 character (unexpected continuation byte 0x82, with no preceding start byte) in subroutine entry at C:/Perl/lib/Data/Dumper.pm line 207, <DATA> line 5.
Malformed UTF-8 character (unexpected continuation byte 0xac, with no preceding start byte) in subroutine entry at C:/Perl/lib/Data/Dumper.pm line 207, <DATA> line 5.
Malformed UTF-8 character (2 bytes, need 3, after start byte 0xe2) in subroutine entry at C:/Perl/lib/Data/Dumper.pm line 207, <DATA> line 5.
Malformed UTF-8 character (unexpected continuation byte 0x82, with no preceding start byte) in subroutine entry at C:/Perl/lib/Data/Dumper.pm line 207, <DATA> line 5.
Malformed UTF-8 character (unexpected continuation byte 0xac, with no preceding start byte) in subroutine entry at C:/Perl/lib/Data/Dumper.pm line 207, <DATA> line 5.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
#! /usr/bin/perl use strict; use warnings; use 5.010; use utf8; use Data::Dumper; my @u = do { local $/ = \2; <DATA>; }; say Dumper \@u; __DATA__ €€€
This is perl 5, version 16, subversion 3 (v5.16.3) built for MSWin32-x86-multi-thread
This is perl 5, version 28, subversion 0 (v5.28.0) built for MSWin32-x64-multi-thread
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ file -i utf8.pl
utf8.pl: text/x-perl; charset=utf-8
$ perl utf8.pl
utf8 "\xE2" does not map to Unicode at utf8.pl line 11, <DATA> chunk 1.
utf8 "\xAC" does not map to Unicode at utf8.pl line 11, <DATA> chunk 2.
utf8 "\x82" does not map to Unicode at utf8.pl line 11, <DATA> chunk 3.
utf8 "\xE2" does not map to Unicode at utf8.pl line 11, <DATA> chunk 4.
utf8 "\xAC" does not map to Unicode at utf8.pl line 11, <DATA> chunk 5.
$VAR1 = [
"\x{2080}",
"\x{c880}\x{2000}",
"\x{ac}\x{c000}",
"\x{2080}",
"\x{c280}
"
];
$ perl -v
This is perl, v5.10.1 (*) built for i686-linux-thread-multi
local $/ = \2;