Schrift
[thread]7910[/thread]

Regex match nicht immer: auslesen aus binärer Datei



<< |< 1 2 >| >> 20 Einträge, 2 Seiten
GwenDragon
 2006-04-20 22:04
#65163 #65163
User since
2005-01-17
14806 Artikel
Admin1
[Homepage]
user image
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
sub myReadLine {
    my $fh = shift;
    
    my $s = '';
    while ( sysread( $fh, my $c, 1 ) ) {
        last if ( $c eq "\x0A" or  $c eq "\x0D" );
        $s = $s. $c;
    }
    return $s;
}

open( my $fh, '<', $oldname ) or die "$oldname: $!";
binmode $fh;
while ( my $s = myReadLine( $fh ) ) {
    ($newname) = $s =~ /\/FullName\s+\(([^)]+)\)/;
    last if defined $newname;
}
close ($fh);
    
warn "$oldname: name of font not found!\n" if not defined $newname;


Ich versuche eine Type 1-Datei auszulesen.
Diese ist zeilenweise aufgebaut, hat jedoch auch binäre Inhalt, der nicht interessiert.

Aus irgendeinem Grund match aber nicht bei allen Dateien das Regex.

Woran liegt das?\n\n

<!--EDIT|GwenDragon|1145556423-->
GwenDragon
 2006-04-20 22:12
#65164 #65164
User since
2005-01-17
14806 Artikel
Admin1
[Homepage]
user image
Ich hätte wohl besser
Code: (dl )
1
2
my $s;
while ( defined ( $s = myReadLine( $fh ) ) )
anstatt
Code: (dl )
while ( my $s = myReadLine( $fh ) ) )

schreiben sollen.
Autsch.

/edit +my $s und zweite code-Zeile\n\n

<!--EDIT|GwenDragon|1145623487-->
renee
 2006-04-20 22:58
#65165 #65165
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
'' ist aber auch defined
Code: (dl )
1
2
3
4
5
C:\Renee>perl
my $s = '';
print "yes" if(defined($s));
^D
yes
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Matze
 2006-04-20 23:57
#65166 #65166
User since
2005-08-29
222 Artikel
BenutzerIn
[Homepage] [default_avatar]
Quote
'' ist aber auch defined


Ich schreibe dann immer:
Code: (dl )
while ($s = ReadLine($fh) && $s !~ /^$/) {

Und wenn Leerzeichen egal sind kannst du ja noch ein \s* mitreinsetzen.

MfG. Matze
Mit freundlichen Grüßen: Matze
GwenDragon
 2006-04-21 00:50
#65167 #65167
User since
2005-01-17
14806 Artikel
Admin1
[Homepage]
user image
typischer Flüchtigkeitsfehler beim Programmieren ;)
Linuxer
 2006-04-21 13:27
#65168 #65168
User since
2006-01-27
3891 Artikel
HausmeisterIn

user image
[quote=renee,20.04.2006, 20:58]'' ist aber auch defined
Code: (dl )
1
2
3
4
5
C:\Renee>perl
my $s = '';
print "yes" if(defined($s));
^D
yes
[/quote]
'' ist defined wenn Du es direkt verwendest, wie Du es getan hast.
Anders sieht es als Rückgabe einer Funktion aus:

$ perl
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
sub aaa {
  my $s = '';   
  return $s;
}

if ( $bb = aaa() ) {
  print "TRUE\n";
} else {
  print "FALSE\n";
}

^D
FALSE\n\n

<!--EDIT|Linuxer|1145611700-->
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
bloonix
 2006-04-21 14:19
#65169 #65169
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Hallo Linuxer,

[quote=Linuxer,21.04.2006, 11:27]'' ist defined wenn Du es direkt verwendest, wie Du es getan hast.
Anders sieht es als Rückgabe einer Funktion aus:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
sub aaa {
  my $s = '';   
  return $s;
}

if ( $bb = aaa() ) {
  print "TRUE
";
} else {
  print "FALSE
";
}

^D
FALSE[/quote]

da muss ich dir aber widersprechen, da du "defined" nicht
verwendest! Selbst mit Rückgabewert "0" würde bei dir
FALSE rauskommen!

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
sub aaa {
 my $s = '';
 return $s;
}

my $bb;

if ( defined ($bb = aaa()) ) {
 print "TRUE ";
} else {
 print "FALSE ";
}


TRUE

Greez,
opi\n\n

<!--EDIT|opi|1145618923-->
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.
Linuxer
 2006-04-21 14:43
#65170 #65170
User since
2006-01-27
3891 Artikel
HausmeisterIn

user image
Der Widerspruch ist akzeptiert. Habe es in der Eile falsch aufgenommen und dementsprechend falsch wiedergegeben.

Im Booleschen Kontext wird '' als FALSE gewertet und der liegt bei if ( $aa ) vor. if ( defined($aa) ) liefert ein anderes Ergebnis, weil hierbei $aa vom defined() geprüft wird.

Greetz,
Linuxer
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
Crian
 2006-04-21 15:14
#65171 #65171
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
Das wär aber auch fatal, wenn '' undef wäre =)
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
bloonix
 2006-04-21 15:26
#65172 #65172
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Mal eine Frage an die Profis hier...

Was passiert eigentlich genau bei defined? Worauf wird intern
geprüft, ob eine Variable nun defined ist oder nicht?

Ich möchte mir gerne vorstellen können, was OS/Perl/Speicher
intern abläuft - überprüft wird. Bislang habe ich den Verdacht,
das mit

Code: (dl )
my $var;


nichts weiter passiert, als das die Variable deklariert ist.
Eine Speicheradresse ist noch nicht zugewiesen.

Mit

Code: (dl )
$var = '';


wird dann erstmals eine Speicheradresse zugewiesen.
defined prüft dann, ob eine Variable eine Speicheradresse hat
oder nicht.

Bin ich auf dem richtigen Dampfer oder liege ich da falsch?

Greez,
opi
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.
<< |< 1 2 >| >> 20 Einträge, 2 Seiten



View all threads created 2006-04-20 22:04.