/ Forside / Teknologi / Udvikling / Perl / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Perl
#NavnPoint
bjarneA 141
poul_from 50
soccer 30
Nicknack 14
Tmpj 0
substr problem ( exception?)
Fra : T. Sandbaek


Dato : 19-03-03 13:16

Hej

Jeg forstår vist ikke helt dokumentationen til substr eller er det eval?, så
jeg håber at der er nogle som kan hjælpe mig lidt.

jeg har en file som er "næsten" kollone baseret, men da det lavet af
programmør som bruger cut and paste, er den ikke helt kollonne baseret, så
derfor tænkte jeg at jeg villle prøve at lave et script som kunne konveter
dataene til en komma sep. fil istedet!
dataene:

NotUsed;
noget ; 1 m Beskrivelse der kan være mange ting
xxxxx ; 0.1 number Endnu en besk
xyxxx ; On / Off Turn on xyxxx
yyyyy ; 0.001 ° temperature in xyx
asd ; Kun Besk. kan indeholde tal, etc.
NotUsed;
etc.

skulle blive til
NotUsed, , , ,
noget , 1 , m, Beskrivelse der kan være mange ting,
xxxxx , 0.1, number, Endnu en besk,
xyxxx , , On / Off, Turn on xyxxx,
etc.
(spaces er under ordnet )

Først har jeg splitte linjen op i før og efter semikolonet
Jeg har så tænkt at jeg ville søge efter et tal inden for de første 0-10
positioner i min variable som indeholder alt efter ';'
men jeg så at $scale indeholdte 0 (ikke "" eller "0" men '\0' i C ) hvis der
ikke var en streng, så jeg satte en if ($scale == 0) ind, men det er vist
ikke den rigtige måde ( jeg får warnings når jeg køre scriptet med warnings
enablet), så jeg prøvede med eval omkring substr, men der sker ingen ting
og min "unit udtrækker" virker ikke når linjen ($comment) er tom når der har
været noget i den en gang før ???, men ok første gang??

Der må være noget simpel og indlysnende som jeg overser, men hvad??

($code,$comment) = split(/;/);
eval {$scale_ = substr($comment, 0,10);}; warn $@ if $@;
$scale_=~/([01\.]+)/g;
$scale=$1;
if ($scale == 0) #if the line is empty, just empty $scale, not \0!!!
{
$scale = "";
$scaleLng = 0;
}
else
{
$scaleLng = $+[0];
}

eval {$unit_ = substr($comment, $scaleLng,16-$scaleLng);}; warn $@ if $@;

$unit_=~/([^\s]+)/;
if ($1 eq "") #if the line is empty, just empty $unit, not \0!!!
{
$unit = "";
}
else
{
#Ok, so we have a unit, and $-[0] contains the start adr. and I hope its
max length is 16!
#(counted 12 in the file I'm looking at now!)
$unit__ = substr($comment, $-[1]+$scaleLng,16);

$unit__ =~ /[.]{6,}/;
$unit = $1;

}


jeg har beholdt/lavet mange temp variabler for at kunne debugge... men jeg
syntes ikke rigtigt det hjælper...

P.S.
Jeg håber at I ikke brokker jer for meget over at jeg har sendt dette
som html, men for at vise kollonere ...


med venlig hilsen
Torben S.



 
 
T. Sandbaek (19-03-2003)
Kommentar
Fra : T. Sandbaek


Dato : 19-03-03 14:16

Hej igen

Grunden til at den ikke kunne finde en "manglende unit" hvis den havde
fundet en unit før, har jeg fundet ud af. RegExp returnere jo sandt eller
falsk afhængig af om den finder noget.... Og det er jo yders anvendeligt,
istedet for at checke resultatet, som ikke ændre sig....

substr og exception forstår jeg stadigt ikke, men måske er det heller ikke
nødvendigt at bruge i mit tilfælde?

med venlig hilsen
Torben

"T. Sandbaek" <tpn@NO-SPAM-PLEASEcontrol-systems.com> wrote in message
news:3e785f1e$0$20434$edfadb0f@dread11.news.tele.dk...
> Hej
>
> Jeg forstår vist ikke helt dokumentationen til substr eller er det eval?,

> jeg håber at der er nogle som kan hjælpe mig lidt.
>
> jeg har en file som er "næsten" kollone baseret, men da det lavet af
> programmør som bruger cut and paste, er den ikke helt kollonne baseret, så
> derfor tænkte jeg at jeg villle prøve at lave et script som kunne konveter
> dataene til en komma sep. fil istedet!
> dataene:
>
> NotUsed;
> noget ; 1 m Beskrivelse der kan være mange ting
> xxxxx ; 0.1 number Endnu en besk
> xyxxx ; On / Off Turn on xyxxx
> yyyyy ; 0.001 ° temperature in xyx
> asd ; Kun Besk. kan indeholde tal, etc.
> NotUsed;
> etc.
>
> skulle blive til
> NotUsed, , , ,
> noget , 1 , m, Beskrivelse der kan være mange ting,
> xxxxx , 0.1, number, Endnu en besk,
> xyxxx , , On / Off, Turn on xyxxx,
> etc.
> (spaces er under ordnet )
>
> Først har jeg splitte linjen op i før og efter semikolonet
> Jeg har så tænkt at jeg ville søge efter et tal inden for de første 0-10
> positioner i min variable som indeholder alt efter ';'
> men jeg så at $scale indeholdte 0 (ikke "" eller "0" men '\0' i C ) hvis
der
> ikke var en streng, så jeg satte en if ($scale == 0) ind, men det er vist
> ikke den rigtige måde ( jeg får warnings når jeg køre scriptet med
warnings
> enablet), så jeg prøvede med eval omkring substr, men der sker ingen ting
> og min "unit udtrækker" virker ikke når linjen ($comment) er tom når der
har
> været noget i den en gang før ???, men ok første gang??
>
> Der må være noget simpel og indlysnende som jeg overser, men hvad??
>
> ($code,$comment) = split(/;/);
> eval {$scale_ = substr($comment, 0,10);}; warn $@ if $@;
> $scale_=~/([01\.]+)/g;
> $scale=$1;
> if ($scale == 0) #if the line is empty, just empty $scale, not \0!!!
> {
> $scale = "";
> $scaleLng = 0;
> }
> else
> {
> $scaleLng = $+[0];
> }
>
> eval {$unit_ = substr($comment, $scaleLng,16-$scaleLng);}; warn $@ if $@;
>
> $unit_=~/([^\s]+)/;
> if ($1 eq "") #if the line is empty, just empty $unit, not \0!!!
> {
> $unit = "";
> }
> else
> {
> #Ok, so we have a unit, and $-[0] contains the start adr. and I hope its
> max length is 16!
> #(counted 12 in the file I'm looking at now!)
> $unit__ = substr($comment, $-[1]+$scaleLng,16);
>
> $unit__ =~ /[.]{6,}/;
> $unit = $1;
>
> }
>
>
> jeg har beholdt/lavet mange temp variabler for at kunne debugge... men jeg
> syntes ikke rigtigt det hjælper...
>
> P.S.
> Jeg håber at I ikke brokker jer for meget over at jeg har sendt dette
> som html, men for at vise kollonere ...
>
>
> med venlig hilsen
> Torben S.
>
>



Tore Gustavsen (19-03-2003)
Kommentar
Fra : Tore Gustavsen


Dato : 19-03-03 17:15

Hei, Torben,

Kodingen din er noget vanskelig å følge, så jeg må innrømme at jeg
ikke gadd sette meg så nøye inn i den.

Det er ofte enklere å bruke s/// (perldoc perlop, perldoc perlre)
enn substr().

Når jeg ser på dataene dine, så ser det ut til at tallene er ordnet i
kolonner. Er ikke de originale dataene ordnet likt som i eksempelet du
har vedlagt, så kan du kanskje modifisere selv.


--- snip ---

#!/usr/bin/perl

use warnings;
$DEBUGGING = 0;

LINJE: while (<DATA>) { # start å lese linjer under __DATA__
# hopp over linjen dersom den ikke kan deles opp
# i 4 felter á 7, 5, 8 og X tegn.
next LINJE unless /^(.{7}); (.{5}) (.{8}) (.+)$/;

($felt, $verdi, $enhet, $beskr) = ($1, $2, $3, $4);
if ($DEBUGGING) {
   print "f : $felt\n"; print "v : $verdi\n";
   print "e : $enhet\n"; print "b : $beskr\n\n";
}
printf "%-10s , %10s , %10s , %10s\n",
    $felt, $verdi, $enhet, $beskr;
}

__DATA__
NotUsed;
noget ; 1 m Beskrivelse der kan være mange ting
xxxxx ; 0.1 number Endnu en besk
xyxxx ; On / Off Turn on xyxxx
yyyyy ; 0.001 ° temperature in xyx
asd ; Kun Besk. kan indeholde tal, etc.
NotUsed;

--- snap ---

Husk også at perl konverterer mellom tall og strenger ved behov.
Et eksempel:

$str1 = " 0.5 ";
$str2 = 3;
print $str1 * $str2; # skriver 1.5
print $str1 . $str2; # skriver " 0.5 3"

Håper dette hjelper. Hvis ikke, kunne du kanskje legge ved litt
ekstra eksempeldata?

--
Tore Gustavsen,
torelg@start.no

T. Sandbaek (20-03-2003)
Kommentar
Fra : T. Sandbaek


Dato : 20-03-03 15:18

Hej

Jeg har stadigt meget at lære.... heldigvis

Tak for inputtene, jeg tror jeg har noget som virker nu, og lidt kloger igen
(forhåbenligt)

med venlig hilsen
Torben



"Tore Gustavsen" <torelg@start.no> wrote in message
news:slrnb7h5th.7bk.torelg@localhost.localdomain...
> Hei, Torben,
>
> Kodingen din er noget vanskelig å følge, så jeg må innrømme at jeg
> ikke gadd sette meg så nøye inn i den.
>
> Det er ofte enklere å bruke s/// (perldoc perlop, perldoc perlre)
> enn substr().
>
> Når jeg ser på dataene dine, så ser det ut til at tallene er ordnet i
> kolonner. Er ikke de originale dataene ordnet likt som i eksempelet du
> har vedlagt, så kan du kanskje modifisere selv.
>
>
> --- snip ---
>
> #!/usr/bin/perl
>
> use warnings;
> $DEBUGGING = 0;
>
> LINJE: while (<DATA>) { # start å lese linjer under __DATA__
> # hopp over linjen dersom den ikke kan deles opp
> # i 4 felter á 7, 5, 8 og X tegn.
> next LINJE unless /^(.{7}); (.{5}) (.{8}) (.+)$/;
>
> ($felt, $verdi, $enhet, $beskr) = ($1, $2, $3, $4);
> if ($DEBUGGING) {
> print "f : $felt\n"; print "v : $verdi\n";
> print "e : $enhet\n"; print "b : $beskr\n\n";
> }
> printf "%-10s , %10s , %10s , %10s\n",
> $felt, $verdi, $enhet, $beskr;
> }
>
> __DATA__
> NotUsed;
> noget ; 1 m Beskrivelse der kan være mange ting
> xxxxx ; 0.1 number Endnu en besk
> xyxxx ; On / Off Turn on xyxxx
> yyyyy ; 0.001 ° temperature in xyx
> asd ; Kun Besk. kan indeholde tal, etc.
> NotUsed;
>
> --- snap ---
>
> Husk også at perl konverterer mellom tall og strenger ved behov.
> Et eksempel:
>
> $str1 = " 0.5 ";
> $str2 = 3;
> print $str1 * $str2; # skriver 1.5
> print $str1 . $str2; # skriver " 0.5 3"
>
> Håper dette hjelper. Hvis ikke, kunne du kanskje legge ved litt
> ekstra eksempeldata?
>
> --
> Tore Gustavsen,
> torelg@start.no



Søg
Reklame
Statistik
Spørgsmål : 177428
Tips : 31962
Nyheder : 719565
Indlæg : 6407938
Brugere : 218877

Månedens bedste
Årets bedste
Sidste års bedste