/ Forside / Teknologi / Operativsystemer / Linux / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Linux
#NavnPoint
o.v.n. 11177
peque 7911
dk 4814
e.c 2359
Uranus 1334
emesen 1334
stone47 1307
linuxrules 1214
Octon 1100
10  BjarneD 875
Inspiration til søgning i en tekst line
Fra : Jan Birk


Dato : 06-02-06 16:18

Jeg har en line af tekstfelter adskilt af et kolon.

Jeg kender ikke positionerne eller antallet af felter. Jeg har brug for
at finde en given værdi, f.eks. ABEKAT i et felt og returnere det næst
kommende felt (indeholde værdien, f.eks. Gorilla .

Nogle gode forslag?

Pft

/Jan

 
 
Peter Makholm (06-02-2006)
Kommentar
Fra : Peter Makholm


Dato : 06-02-06 16:37

Jan Birk <jan.birk@invalid.domain.null> writes:

> Jeg kender ikke positionerne eller antallet af felter. Jeg har brug
> for at finde en given værdi, f.eks. ABEKAT i et felt og returnere det
> næst kommende felt (indeholde værdien, f.eks. Gorilla .
>
> Nogle gode forslag?

Perl - hvad ellers?

Split linjen på kolon. Løb indekserne igennem og hvis $F[$i] matcher
din værdi, så skriver du $F[$i+1] ud.

--
Peter Makholm | Why does the entertainment industry wants us to
peter@makholm.net | believe that a society base on full surveillance
http://hacking.dk | is bad?
| Do they have something to hide?

Jan Birk (06-02-2006)
Kommentar
Fra : Jan Birk


Dato : 06-02-06 16:58

> Perl - hvad ellers?

Tjaa, hvis ikke kan slippe for at lære perl, så må jeg jo igang. Det
virker bare lidt voldsomt for en onetimer )

> Split linjen på kolon. Løb indekserne igennem og hvis $F[$i] matcher
> din værdi, så skriver du $F[$i+1] ud.

Tak!

/Jan


Jan Birk (06-02-2006)
Kommentar
Fra : Jan Birk


Dato : 06-02-06 17:25

> Split linjen på kolon. Løb indekserne igennem og hvis $F[$i] matcher
> din værdi, så skriver du $F[$i+1] ud.

Tak, det var jo ikke slemt! Det kunne være at tiden er inde til at bruge
et par dage på perl

for ($i = 0 ; $i < @elementer ; $i++) {
if (@elementer[$i] eq "DTEND") {
printf("%s = %s\n",@elementer[$i],@elementer[$i + 1]);
}
}


/Jan

Peter Makholm (06-02-2006)
Kommentar
Fra : Peter Makholm


Dato : 06-02-06 19:20

Jan Birk <jan.birk@invalid.domain.null> writes:

>> Split linjen på kolon. Løb indekserne igennem og hvis $F[$i] matcher
>> din værdi, så skriver du $F[$i+1] ud.
>
> Tak, det var jo ikke slemt! Det kunne være at tiden er inde til at
> bruge et par dage på perl
>
> for ($i = 0 ; $i < @elementer ; $i++) {
> if (@elementer[$i] eq "DTEND") {
> printf("%s = %s\n",@elementer[$i],@elementer[$i + 1]);
> }
> }

Ikke dårligt. Men hvis du sætter dig til at lære perl, så vil jeg lige
kommentere din kode. Når du i perl skal have fat i et enkelt element
af en eller anden type, så skal du næsten altid bruge $ og ikke @. Det
vil sige at i if-sætningen og i printf-sætningen skal du bruge
$elementer[$i].

Desuden er det meget sjældent man bruger printf i perl. Oftest bruger
man interpolation af variable, det vil sige at de automatis bliver sat
ind i strenge hvis der er "" rundt om istedet for ''.

Jeg ville skrive ovenstående som:

for ($i = 0 ; $i < @elements; $i++) {
if ($elements[$i] eq 'DTEND') {
print "$elements[$i] = $elements[$i+1]\n";
}
}

--
Peter Makholm | First you fall in love with Antarctica, and then it
peter@makholm.net | breaks your heart
http://hacking.dk | -- Antarctica

Jan Birk (06-02-2006)
Kommentar
Fra : Jan Birk


Dato : 06-02-06 19:38

> Jeg ville skrive ovenstående som:
>
> for ($i = 0 ; $i < @elements; $i++) {
> if ($elements[$i] eq 'DTEND') {
> print "$elements[$i] = $elements[$i+1]\n";
> }
> }

Mange tak. Jeg kan godt se pointen (resultatet er dog kun et '='

Men, hvis man ikke bruger printf (jeg lærte printf i skolen og har hængt
på den), hvordan formatterer man så i perl?

/Jan

Adam Sjøgren (06-02-2006)
Kommentar
Fra : Adam Sjøgren


Dato : 06-02-06 19:27

On Mon, 06 Feb 2006 17:25:26 +0100, Jan wrote:

> if (@elementer[$i] eq "DTEND") {

Bør være $elementer[$i].

Brokker din perl sig ikke over det?

(Husk altid use strict; use warnings; når du skriver Perl

Og:

> if (@elementer[$i] eq "DTEND") {
> printf("%s = %s\n",@elementer[$i],@elementer[$i + 1]);

samme her og her.

Du kan i øvrigt skrive den sidste linie lidt mindre C-agtigt, hvis du
har lyst:

print $elementer[$i] . ' = ' . $elementer[$i+1] . "\n";


Videre sniksnakkeri i dk.edb.programmering.perl (followup-to)


Mvh.

--
"Lad bare kulturministeren kalde H. C. Andersen et Adam Sjøgren
'fantastisk brand' - det siger alt om niveauet i dansk asjo@diku.dk
kulturpolitik."

Adam Sjøgren (06-02-2006)
Kommentar
Fra : Adam Sjøgren


Dato : 06-02-06 19:27

On Mon, 06 Feb 2006 19:20:00 +0100, Peter wrote:

> Jeg ville skrive ovenstående som:

> for ($i = 0 ; $i < @elements; $i++) {
my $i

?


,

--
"we push onward. to you, it is 2005, to us, it is Adam Sjøgren
2011. we are always far ahead." asjo@koldfront.dk

Jan Birk (06-02-2006)
Kommentar
Fra : Jan Birk


Dato : 06-02-06 19:39

>> Jeg ville skrive ovenstående som:
>
>> for ($i = 0 ; $i < @elements; $i++) {
> my $i

Der er mange muligheder for at udtrykke det samme. Det er lidt
forvirrende ))

/Jan

Jesper Krogh (06-02-2006)
Kommentar
Fra : Jesper Krogh


Dato : 06-02-06 19:47

I dk.edb.system.unix, skrev Jan Birk:
> >> Jeg ville skrive ovenstående som:
> >
> >> for ($i = 0 ; $i < @elements; $i++) {
> > my $i
>
> Der er mange muligheder for at udtrykke det samme. Det er lidt
> forvirrende ))

Som Adam skriver:

#!/usr/bin/perl
use strict;
use warnings;

Her begynder din perl-kode.

Jesper

--
../Jesper Krogh, jesper@krogh.cc, Jabber ID: jesper@jabbernet.dk


Peter Makholm (06-02-2006)
Kommentar
Fra : Peter Makholm


Dato : 06-02-06 19:53

asjo@koldfront.dk (Adam Sjøgren) writes:

>> for ($i = 0 ; $i < @elements; $i++) {
> my $i
>
> ?

Aldrig i livet. Eller jo, hvis jeg brugte 'use strict' ville jeg nok
foretrække 'my $i' frem for at bruge $a eller $b til den slags løkker.

--
Peter Makholm | Perhaps that late-night surfing is not such a
peter@makholm.net | waste of time after all: it is just the web
http://hacking.dk | dreaming
| -- Tim Berners-Lee

Adam Sjøgren (06-02-2006)
Kommentar
Fra : Adam Sjøgren


Dato : 06-02-06 20:26

On Mon, 06 Feb 2006 19:53:27 +0100, Peter wrote:

> Aldrig i livet. Eller jo, hvis jeg brugte 'use strict' ville jeg nok
> foretrække 'my $i' frem for at bruge $a eller $b til den slags løkker.

;-D


Mvh.

Adam (der er blevet bidt af $a og $b mere end én gang)

--
"Äter ni middag?" Adam Sjøgren
asjo@koldfront.dk

Jan Birk (06-02-2006)
Kommentar
Fra : Jan Birk


Dato : 06-02-06 20:32

>> Aldrig i livet. Eller jo, hvis jeg brugte 'use strict' ville jeg nok
>> foretrække 'my $i' frem for at bruge $a eller $b til den slags løkker.
>
> ;-D


Måske en novice kan blive indført i forskellen - uden at læse 800
sider??

/Jan

Adam Sjøgren (06-02-2006)
Kommentar
Fra : Adam Sjøgren


Dato : 06-02-06 20:31

On Mon, 06 Feb 2006 19:39:12 +0100, Jan wrote:

> Der er mange muligheder for at udtrykke det samme. Det er lidt
> forvirrende ))

Ja. Det er også en af forcerne.


,

--
"we push onward. to you, it is 2005, to us, it is Adam Sjøgren
2011. we are always far ahead." asjo@koldfront.dk

Adam Sjøgren (06-02-2006)
Kommentar
Fra : Adam Sjøgren


Dato : 06-02-06 20:31

On Mon, 06 Feb 2006 19:37:43 +0100, Jan wrote:

> Men, hvis man ikke bruger printf (jeg lærte printf i skolen og har
> hængt på den), hvordan formatterer man så i perl?

Man bruger sjældent printf i Perl når man bare vi sætte strenge
sammen. Da bruger man oftest enten interpolation:

print "Hello $name";

eller concatenation (hvad er det tilsvarende danske udtryk?):

print 'Hello ' . $name;

Man sparer at tælle

printf/sprintf bruges typisk kun når man gerne vil have tal til at stå
pænt under hinanden og i den dur.


I rigtigt gamle dage var formats obligatorisk pensum når man lærte
Perl. Det bruges vist sjældent i dag?


Videre i dk.edb.programmering.perl.


Mvh.

--
"we push onward. to you, it is 2005, to us, it is Adam Sjøgren
2011. we are always far ahead." asjo@koldfront.dk

Peter Makholm (06-02-2006)
Kommentar
Fra : Peter Makholm


Dato : 06-02-06 21:09

Jan Birk <jan.birk@invalid.domain.null> writes:

>>> Aldrig i livet. Eller jo, hvis jeg brugte 'use strict' ville jeg nok
>>> foretrække 'my $i' frem for at bruge $a eller $b til den slags løkker.
>> ;-D
>
>
> Måske en novice kan blive indført i forskellen - uden at læse 800
> sider??

Når man skriver 'use strict' i sit perlprogram skal man erklære alle
varialbe, undtagen $a og $b. De håndteres specielt fordi de bruges når
man sorterer:

@sorted = sort { $a <=> $b } @numbers

--
Peter Makholm | What if:
peter@makholm.net | IBM bought Xenix from Microsoft instead of buying
http://hacking.dk | DOS?

Ukendt (06-02-2006)
Kommentar
Fra : Ukendt


Dato : 06-02-06 18:37

Jan Birk wrote:
>
> Jeg har en line af tekstfelter adskilt af et kolon.
>
> Jeg kender ikke positionerne eller antallet af felter. Jeg har brug for
> at finde en given værdi, f.eks. ABEKAT i et felt og returnere det næst
> kommende felt (indeholde værdien, f.eks. Gorilla .
>
> Nogle gode forslag?

grep ABEKAT|sed -e 's/.*:ABEKAT:\([^:]*\):.*/\1/'

Eller måske

sed -e 's/.*:ABEKAT:\([^:]*\):.*/\1/;t;s/.*//'

--
Kasper Dupont -- Rigtige mænd skriver deres egne backupprogrammer
#define _(_)"d.%.4s%."_"2s" /* This is my new email address */
char*_="@2kaspner"_()"%03"_("4s%.")"t\n";printf(_+11,_+6,_,6,_+2,_+7,_+6);

Jan Birk (06-02-2006)
Kommentar
Fra : Jan Birk


Dato : 06-02-06 19:02

>> Nogle gode forslag?
>
> grep ABEKAT|sed -e 's/.*:ABEKAT:\([^:]*\):.*/\1/'
>
> Eller måske
>
> sed -e 's/.*:ABEKAT:\([^:]*\):.*/\1/;t;s/.*//'

Ikke ringe, ikke ringe....

Tak

/Jan


Jan Birk (06-02-2006)
Kommentar
Fra : Jan Birk


Dato : 06-02-06 19:06

> sed -e 's/.*:ABEKAT:\([^:]*\):.*/\1/;t;s/.*//'

Du kan måske også .... Et af felterne indeholder et semikolon ";". I
din fine løsning kommer teksten efter semikolon ikke med.

Pft

/Jan

Jan Birk (06-02-2006)
Kommentar
Fra : Jan Birk


Dato : 06-02-06 19:09

> Du kan måske også .... Et af felterne indeholder et semikolon ";". I
> din fine løsning kommer teksten efter semikolon ikke med.

Glem det, din løsning virker fint, det er mig der ikke kan læse...

/Jan

N/A (06-02-2006)
Kommentar
Fra : N/A


Dato : 06-02-06 19:38



N/A (06-02-2006)
Kommentar
Fra : N/A


Dato : 06-02-06 20:32



Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408526
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste