/ 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
Konvertering af tekst til fast bredde o.a.
Fra : Lars Kim Lund


Dato : 01-02-01 22:18


Davs gruppe.

Jeg har en masse tekstfiler, jeg gerne vil have konverteret til fast
bredde, f.eks. 80 tegn. Jeg har tænkt på et par algoritmer, men jeg
synes de virker lidt omstændige. Gode forslag?

Jeg har et andet script hvor jeg skal skifte en variable mellem 1 og 2
mellem hvert kald af funktionen. Jeg laver det med en if/else men det
ser lidt uperlsk ud.

Hvordan laver man flg. mere elegant

if ($c == 1) {
$c = 2;
}
else {
$c = 1;
}

--
Lars Kim Lund
http://www.net-faq.dk/

 
 
Lars Balker Rasmusse~ (01-02-2001)
Kommentar
Fra : Lars Balker Rasmusse~


Dato : 01-02-01 22:38

Lars Kim Lund <larskim@mail.com> writes:
> Jeg har en masse tekstfiler, jeg gerne vil have konverteret til fast
> bredde, f.eks. 80 tegn. Jeg har tænkt på et par algoritmer, men jeg
> synes de virker lidt omstændige. Gode forslag?

http://www.perldoc.com/cpan/Text/Autoformat.html#Justification

> Jeg har et andet script hvor jeg skal skifte en variable mellem 1 og 2
> mellem hvert kald af funktionen. Jeg laver det med en if/else men det
> ser lidt uperlsk ud.
>
> Hvordan laver man flg. mere elegant
>
> if ($c == 1) {
> $c = 2;
> }
> else {
> $c = 1;
> }

Elegant? Ved jeg ikke, men en af følgende perversiteter:

$c = $c == 1 ? 2 : 1;
$c = 1 + !($c - 1);

Den korteste er dog

$c ^= 3;

Nogen gange skal man dog skrive det man har det bedst med.
--
Lars Balker Rasmussen "Woo hoo!?"

Jakob Schmidt (02-02-2001)
Kommentar
Fra : Jakob Schmidt


Dato : 02-02-01 00:09

Lars Balker Rasmussen <lars@balker.org> writes:

> Lars Kim Lund <larskim@mail.com> writes:
> > Hvordan laver man flg. mere elegant
> >
> > if ($c == 1) {
> > $c = 2;
> > }
> > else {
> > $c = 1;
> > }
>
> Elegant? Ved jeg ikke, men en af følgende perversiteter:
>
> $c = $c == 1 ? 2 : 1;

Ja, det synes jeg nok er den mest idiomatiske, men blot ved at bruge
kanonisk perl stil bliver den oprindelige kode faktisk ganske OK:

if ( $c == 1 ) { $c = 2 }
else { $c = 1 }

> $c = 1 + !($c - 1);

Nasty

> Den korteste er dog
>
> $c ^= 3;

Woo-Hooo!

Den kræver dog modsat de øvrige, at $c er initialiseret til 1 eller 2.

How about

$c = 1 + $c % 2;

som bliver til

( $c %= 2 )++;

hvis man er rigtig ond...

Faktisk tror jeg nu forresten altid, at jeg ville vælge at løse den opgave at
skifte mellem to værdier som et boolsk fænomen. Hvis jeg har brug for
skiftevis 1 og to ville jeg nok

$erto = !$erto;

og så bruge $erto + 1 alle vegne. Det bliver koden måske ikke mere elegant
af, men begrebs- og forståelsesmæssigt er det smukkere.

--
Jakob Schmidt
http://aut.dk/orqwood
etc.

Jakob Schmidt (02-02-2001)
Kommentar
Fra : Jakob Schmidt


Dato : 02-02-01 00:26

Jakob Schmidt <sumus@aut.dk> writes:

> Lars Balker Rasmussen <lars@balker.org> writes:
> > Den korteste er dog
> >
> > $c ^= 3;
>
> Woo-Hooo!
>
> Den kræver dog modsat de øvrige, at $c er initialiseret til 1 eller 2.

Hvis man kan leve med det, synes jeg forresten at

$c = 3 - $c;

er cool

Den kan også perverteres til

( $c -= 3 ) *= -1;

men så er den ikke cool længere.

Spørgsmålet er, hvad det er, der får mig til at sidde her og spilde min
tid på den måde???

--
Jakob Schmidt
http://aut.dk/orqwood
etc.

Lars Kim Lund (02-02-2001)
Kommentar
Fra : Lars Kim Lund


Dato : 02-02-01 00:35

Hej Jakob Schmidt <sumus@aut.dk>

> $c = 3 - $c;

Woo, kewl! Hvorfor gøre det sværere end det er, tak.

--
Lars Kim Lund
http://www.net-faq.dk/

Peter J. Acklam (02-02-2001)
Kommentar
Fra : Peter J. Acklam


Dato : 02-02-01 09:41

Jakob Schmidt <sumus@aut.dk> writes:

> Lars Balker Rasmussen <lars@balker.org> writes:
>
> > Elegant? Ved jeg ikke, men en af følgende perversiteter:
> >
> > $c = $c == 1 ? 2 : 1;
>
> Ja, det synes jeg nok er den mest idiomatiske, men blot ved at
> bruge kanonisk perl stil bliver den oprindelige kode faktisk
> ganske OK:
>
> if ( $c == 1 ) { $c = 2 }
> else { $c = 1 }

Hva med

$c = 2 if $c == 1;

Peter

--
$\="\n";$_='The quick brown fox jumps over the lazy dog';print +(split
//)[20,5,24,31,3,36,14,12,31,1,2,11,9,23,33,29,35,15,32,36,7,8,28,29];

(One billion seconds since the epoch at 2001-09-09 03:46:40)

Lars Kim Lund (02-02-2001)
Kommentar
Fra : Lars Kim Lund


Dato : 02-02-01 10:32

Hej jacklam@math.uio.no (Peter J. Acklam)

>Hva med
>
> $c = 2 if $c == 1;

Har du ikke glemt en parantes?

Har ikke afprøvet det, men så vidt jeg lige læser koden så virker den
kun med 1 -> 2, og ikke med 2 -> 1 .

--
Lars Kim Lund
http://www.net-faq.dk/

Thorbjørn Ravn Ander~ (02-02-2001)
Kommentar
Fra : Thorbjørn Ravn Ander~


Dato : 02-02-01 10:58

Jakob Schmidt wrote:

> Faktisk tror jeg nu forresten altid, at jeg ville vælge at løse den opgave at
> skifte mellem to værdier som et boolsk fænomen. Hvis jeg har brug for
> skiftevis 1 og to ville jeg nok
>
> $erto = !$erto;
>
> og så bruge $erto + 1 alle vegne. Det bliver koden måske ikke mere elegant
> af, men begrebs- og forståelsesmæssigt er det smukkere.

Jeg kunne formode at LKL er ved at implementere en tilstandsmaskine, og
så kunne man lave noget i stil med

$nextstate{"1"} = "2";
$nextstate{"2"} = "1";
$state = "1";
....

$state = $nextstate{$state};


Princippet lader sig let udvide til flere variable (hvilket oftest gør
sig gældende).


--
Thorbjørn Ravn Andersen "...sound of...Tubular Bells!"
http://bigfoot.com/~thunderbear

Lars Kim Lund (02-02-2001)
Kommentar
Fra : Lars Kim Lund


Dato : 02-02-01 00:26

Hej Lars Balker Rasmussen <lars@balker.org>

>> Jeg har en masse tekstfiler, jeg gerne vil have konverteret til fast
>> bredde, f.eks. 80 tegn. Jeg har tænkt på et par algoritmer, men jeg
>> synes de virker lidt omstændige. Gode forslag?
>
>http://www.perldoc.com/cpan/Text/Autoformat.html#Justification

Close, but no cigar. Kan i hvert fald ikke få det til at virke. Mit
problem er helt konkret at jeg har nogle fundats-tekster på usenet.dk
jeg gerne vil reformartere. Prøvede også lige med text::wrap, men den
gør heller ikke tingene korrekt.

F.eks.

1. Gruppenavn:
dk.admin

2. Beskrivelse:
dk.*-hierarkiets udvikling og opbygning

3. Fundats:
dk.admin.* handler om dk.*-hierarkiet i almindelighed og om hvord det
gøres til et brugbart og levende hierarki.

Hovedsageligt bruges dk.admin til debat om forslag til nye
nyhedsgrupper efter modellen pÕ http://www.usenet.dk/otd.

Skal ved en fiktiv liniebredde (i praksis 70 tegn) se sådan ud:

<------------------------>
1. Gruppenavn:
dk.admin

2. Beskrivelse:
dk.*-hierarkiets udvikling
og opbygning

3. Fundats:
dk.admin.* handler om
dk.*-hierarkiet i
almindelighed og om hvord
det gøres til et brugbart
og levende hierarki.

Hovedsageligt bruges
dk.admin til debat om
forslag til nye
nyhedsgrupper efter
modellen på
http://www.usenet.dk/otd.

Gode forslag? Materialet er her: http://www.usenet.dk/grupper/fundats/

>Elegant? Ved jeg ikke, men en af følgende perversiteter:
>
> $c = $c == 1 ? 2 : 1;
> $c = 1 + !($c - 1);

>Den korteste er dog
>
> $c ^= 3;

Syret. :)

>Nogen gange skal man dog skrive det man har det bedst med.

Bit-operationer er naturligvis sjove, men det er godt nok ikke nær så
gennemskueligt som en if/else konstruktion. :)

Tak.

--
Lars Kim Lund
http://www.net-faq.dk/

Lars Balker Rasmusse~ (02-02-2001)
Kommentar
Fra : Lars Balker Rasmusse~


Dato : 02-02-01 13:04

Lars Kim Lund <larskim@mail.com> writes:
> Hej Lars Balker Rasmussen <lars@balker.org>
>
> >> Jeg har en masse tekstfiler, jeg gerne vil have konverteret til fast
> >> bredde, f.eks. 80 tegn. Jeg har tænkt på et par algoritmer, men jeg
> >> synes de virker lidt omstændige. Gode forslag?
> >
> >http://www.perldoc.com/cpan/Text/Autoformat.html#Justification
>
> Close, but no cigar. Kan i hvert fald ikke få det til at virke. Mit
> problem er helt konkret at jeg har nogle fundats-tekster på usenet.dk
> jeg gerne vil reformartere. Prøvede også lige med text::wrap, men den
> gør heller ikke tingene korrekt.

> F.eks.
>
> 3. Fundats:
> dk.admin.* handler om dk.*-hierarkiet i almindelighed og om hvord det
> gøres til et brugbart og levende hierarki.
>
> Hovedsageligt bruges dk.admin til debat om forslag til nye
> nyhedsgrupper efter modellen pÕ http://www.usenet.dk/otd.
>
> Skal ved en fiktiv liniebredde (i praksis 70 tegn) se sådan ud:
>
> <------------------------>
> 3. Fundats:
> dk.admin.* handler om
> dk.*-hierarkiet i
> almindelighed og om hvord
> det gøres til et brugbart
> og levende hierarki.

Ah, jeg læste fast bredde som både højre og venstre justificeret.

format STDOUT =
^<<<<<<<<<<<<<<<<<<<<<<<<<
$text
^<<<<<<<<<<<<<<<<<<<<<<<<< ~~
$text
..

$text = "dk.admin.* handler om dk.*-hierarkiet i almindelighed og om " .
"hvord det gøres til et brugbart og levende hierarki.";

write;

--
Lars Balker Rasmussen "Special is bad."

Martin Moller Peders~ (02-02-2001)
Kommentar
Fra : Martin Moller Peders~


Dato : 02-02-01 13:12

In <ubssmrsmv.fsf@balker.org> Lars Balker Rasmussen <lars@balker.org> writes:

>Lars Kim Lund <larskim@mail.com> writes:
>> Jeg har en masse tekstfiler, jeg gerne vil have konverteret til fast
>> bredde, f.eks. 80 tegn. Jeg har tænkt på et par algoritmer, men jeg
>> synes de virker lidt omstændige. Gode forslag?

>http://www.perldoc.com/cpan/Text/Autoformat.html#Justification

>> Jeg har et andet script hvor jeg skal skifte en variable mellem 1 og 2
>> mellem hvert kald af funktionen. Jeg laver det med en if/else men det
>> ser lidt uperlsk ud.
>>
>> Hvordan laver man flg. mere elegant
>>
>> if ($c == 1) {
>> $c = 2;
>> }
>> else {
>> $c = 1;
>> }

>Elegant? Ved jeg ikke, men en af følgende perversiteter:

> $c = $c == 1 ? 2 : 1;
> $c = 1 + !($c - 1);

>Den korteste er dog

> $c ^= 3;

Eller $c=1+($c==1);

Adam Sjøgren (01-02-2001)
Kommentar
Fra : Adam Sjøgren


Dato : 01-02-01 22:56

On Thu, 01 Feb 2001 22:17:52 +0100, Lars Kim Lund wrote:

> Jeg har en masse tekstfiler, jeg gerne vil have konverteret til fast
> bredde, f.eks. 80 tegn. Jeg har tænkt på et par algoritmer, men jeg
> synes de virker lidt omstændige. Gode forslag?

use Text::Autoformat;

$formatted=autoformat $text, { left=>1, right=>80 };

?


Mvh.

--
"What about 'swing'?" Adam Sjøgren
"Swing? That's a good message." asjo@koldfront.dk

Thorbjørn Ravn Ander~ (02-02-2001)
Kommentar
Fra : Thorbjørn Ravn Ander~


Dato : 02-02-01 10:55

Lars Kim Lund wrote:
>
> Davs gruppe.
>
> Jeg har en masse tekstfiler, jeg gerne vil have konverteret til fast
> bredde, f.eks. 80 tegn. Jeg har tænkt på et par algoritmer, men jeg
> synes de virker lidt omstændige. Gode forslag?

perldoc perlform

Nok lige det du skal bruge.

>
> Jeg har et andet script hvor jeg skal skifte en variable mellem 1 og 2
> mellem hvert kald af funktionen. Jeg laver det med en if/else men det
> ser lidt uperlsk ud.
>
> Hvordan laver man flg. mere elegant
>
> if ($c == 1) {
> $c = 2;
> }
> else {
> $c = 1;
> }
>

$c = 3 - $c?

--
Thorbjørn Ravn Andersen "...sound of...Tubular Bells!"
http://bigfoot.com/~thunderbear

Jakob Schmidt (02-02-2001)
Kommentar
Fra : Jakob Schmidt


Dato : 02-02-01 21:02

Thorbjørn Ravn Andersen <thunderbear@bigfoot.com> writes:
>
> $c = 3 - $c?

Brilliant - only: I beat you to it

--
Jakob Schmidt
http://aut.dk/orqwood
etc.

Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409079
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste