One -liner program - One-liner program
Oprindeligt var et one-liner-program tekstindtastning til kommandolinjen i et operativsystems shell, der udfører en eller anden funktion på kun en inputlinje. One-liner kan være
- et udtryk skrevet på skalets sprog;
- påkaldelsen af en tolk sammen med programkilden for tolken at køre;
- indkaldelse af en kompilator sammen med kilde til kompilering og instruktioner til udførelse af det kompilerede program.
Visse dynamiske scriptsprog som AWK , sed og Perl har traditionelt været dygtige til at udtrykke one-liners. Shell- tolke som Unix-skaller eller Windows PowerShell tillader konstruktion af kraftfulde one-liners.
Brugen af udtrykket one-liner er blevet udvidet til også at omfatte program-kilde til ethvert sprog, der gør noget nyttigt i en linje.
Historie
Begrebet et one-liner program har været kendt siden 1960'erne med udgivelsen af APL programmeringssprog. Med sin korte syntaks og kraftfulde matematiske operatorer tillod APL nyttige programmer at blive repræsenteret i et par symboler.
I 1970'erne blev one-liners forbundet med fremkomsten af hjemmecomputeren og BASIC . Computermagasiner udgav indskrivningsprogrammer på mange BASIC-dialekter. Nogle magasiner afsatte regelmæssige spalter udelukkende til imponerende korte og enlinjede programmer.
Ordet One-liner har også to referencer i indekset til bogen The AWK Programming Language (bogen omtales ofte med forkortelsen TAPL ). Det forklarer programmeringssproget AWK , som er en del af Unix -operativsystemet . Forfatterne forklarer fødslen af one-liner- paradigmet med deres daglige arbejde med tidlige Unix- maskiner:
1977-versionen havde kun få indbyggede variabler og foruddefinerede funktioner. Det var designet til at skrive korte programmer […] Vores model var, at en påkaldelse ville være en eller to linjer lang, indtastet og brugt med det samme. Standardværdier blev valgt for at matche denne stil […] Vi, som forfattere, vidste, hvordan sproget skulle bruges, og derfor skrev vi kun one-liners.
Bemærk, at denne originale definition af en one-liner indebærer øjeblikkelig udførelse af programmet uden kompilering. Så i streng forstand er det kun kildekode til fortolkede sprog, der kvalificeres som en en-liner . Men denne strenge forståelse af en one-liner blev udvidet i 1985, da IOCCC introducerede kategorien Best One Liner for C , som er et kompileret sprog.
Eksempler
One-liners bruges også til at vise forskellen udtrykskraft af programmeringssprog . Ofte bruges one-liners til at demonstrere programmeringsevne. Der afholdes ofte konkurrencer for at se, hvem der kan skabe den mest exceptionelle one-liner.
GRUNDLÆGGENDE
En enkelt BASIC -linje kan typisk indeholde op til 255 tegn, og en liners spænder fra enkle spil til grafiske demoer. En af de mere kendte demo one-liners er i daglig tale kendt som 10PRINT , skrevet til Commodore 64 :
10 PRINT CHR$(205.5+RND(1)); : GOTO 10
C
Det følgende eksempel er et C- program (en vindende post i kategorien "Bedste en-liner" i IOCCC ).
main(int c,char**v){return!m(v[1],v[2]);}m(char*s,char*t){return*t-42?*s?63==*t|*s==*t&&m(s+1,t+1):!*t:m(s,t+1)||*s&&m(s+1,t);}
Dette one-liner program er et glob mønster matcher. Det forstår glob tegn "*" betyder "nul eller flere tegn" og "? ' hvilket betyder præcis et tegn, ligesom de fleste Unix -skaller .
Kør det med to args, strengen og globmønsteret. Afslutningsstatus er 0 (shell sand), når mønsteret matcher, 1 ellers. Kuglemønsteret skal matche hele strengen, så du vil måske bruge * i begyndelsen og slutningen af mønsteret, hvis du leder efter noget i midten. Eksempler:
$ ./a.out foo 'f??'; echo $?
$ ./a.out 'best short program' '??st*o**p?*'; echo $?
AWK
Den TAPL Bogen indeholder 20 eksempler på oneliners i slutningen af bogens første kapitel.
Her er den allerførste af dem:
- Udskriv det samlede antal inputlinjer:
END { print NR }
- Udskriv den tiende indtastningslinje:
NR == 10
- Udskriv det sidste felt på hver inputlinje:
{ print $NF }
J
Her er eksempler i J :
- En funktion gennemsnit til at returnere gennemsnittet af en liste med tal:
avg=: +/ % #
-
Quicksort :
quicksort=: (($:@(<#[) , (=#[) , $:@(>#[)) ({~ ?@#)) ^: (1<#)
Perl
Her er eksempler på Perl programmeringssprog :
- Kig efter dublerede ord
perl -0777 -ne 'print "$.: doubled $_\n" while /\b(\w+)\b\s+\b\1\b/gi'
- Find palindromer i/usr/dict/ord
perl -lne 'print if $_ eq reverse' /usr/dict/words
- på stedet redigering af *.c-filer, der ændrer alle foo til bar
perl -p -i.bak -e 's/\bfoo\b/bar/g' *.c
Mange one-liners er praktiske. For eksempel vil følgende Perl one-liner vende alle bytes i en fil:
perl -0777e 'print scalar reverse <>' filename
Mens de fleste Perl one-liners er tvingende nødvendige, tillader Perls støtte til anonyme funktioner, lukninger, kort, filter (grep) og fold (List :: Util :: reduc) at oprette 'funktionelle' one-liners.
Denne one-liner opretter en funktion, der kan bruges til at returnere en liste med primtal op til værdien af den første parameter:
my $z = sub { grep { $a=$_; !grep { !($a % $_) } (2..$_-1)} (2..$_[0]) }
Det kan bruges på kommandolinjen, sådan her:
perl -e'$,=",";print sub { grep { $a=$_; !grep { !($a % $_) } (2..$_-1)} (2..$_[0]) }->(shift)' number
for at udskrive en kommasepareret liste over primtal i området 2 - nummer.
Haskell
Følgende Haskell- program er en one-liner: det sorterer sine inputlinjer ASCIIbetisk .
main = (mapM_ putStrLn . Data.List.sort . lines) =<< getContents -- In ghci a qualified name like Data.List.sort will work, although as a standalone executable you'd need to import Data.List.
Endnu en kortere version:
main = interact (unlines . Data.List.sort . lines) -- Ditto.
Kan bruges på kommandolinjen som:
cat filename | ghc -e "interact (unlines . Data.List.sort . lines)"
Ketcher
Følgende Racket -program svarer til ovenstående Haskell -eksempel:
#lang racket
(for-each displayln (sort (port->lines) string<?))
og dette kan bruges på kommandolinjen som følger:
racket -e '(for-each displayln (sort (port->lines) string<?))'
Python
Udførelse af one-liners direkte på Unix-kommandolinjen kan opnås ved hjælp af Pythons -cmd-flag (-c for kort) og kræver typisk import af et eller flere moduler. Erklæringer adskilles ved hjælp af ";" i stedet for nye linjer. For eksempel at udskrive det sidste felt med unix long listing:
ls -l | python -c "import sys;[sys.stdout.write(' '.join([line.split(' ')[-1]])) for line in sys.stdin]"
Python indpakninger
Flere open-source scripts er blevet udviklet for at lette konstruktionen af Python one-liners. Scripts som f.eks. Pyp eller Pyline importerer almindeligt anvendte moduler og giver mere læselige variabler i et forsøg på at gøre Python-funktionalitet mere tilgængelig på kommandolinjen. Her er en gentagelse af ovenstående eksempel (udskrivning af det sidste felt i en unix lang liste):
ls -l | pyp "whitespace[-1]" # "whitespace" represents each line split on white space in pyp
ls -l | pyline "words[-1]" # "words" represents each line split on white space in pyline
Eksekverbare biblioteker
Python CGIHTTPServer -modulet er f.eks. Også et eksekverbart bibliotek, der fungerer som en webserver med CGI. For at starte webserveren skal du indtaste:
$ python -m CGIHTTPServer
Serving HTTP on 0.0.0.0 port 8000 …
TCL Tool Control Language
Tcl (Tool Command Language) er et dynamisk programmerings-/scriptsprog baseret på begreberne Lisp, C og Unix -skaller. Det kan bruges interaktivt eller ved at køre scripts (programmer), som kan bruge et pakkesystem til strukturering. Følgende er direkte citater fra Wiki Books Tcl Programming. Teksten i Wiki Books Tcl Programming er tilgængelig under Creative Commons Attribution-ShareAlike License.
Mange strenge er også velformede lister. Hvert enkelt ord er en liste med længde et, og elementer i længere lister er adskilt af mellemrum. For eksempel en streng, der svarer til en liste over tre elementer:
set example {foo bar grill}
Strenge med ubalancerede anførselstegn eller seler eller tegn uden mellemrum direkte efter lukkede seler kan ikke parses som lister direkte. Du kan eksplicit dele dem for at lave en liste.
"Konstruktøren" til lister kaldes naturligvis liste. Det anbefales at bruge, når elementer kommer fra variabel eller kommandosubstitution (seler gør det ikke). Da Tcl -kommandoer alligevel er lister, er følgende en fuld erstatning for listekommandoen:
# One liners program
proc list args {set args}
Windows PowerShell
Find palindromer i filen word.txt
Get-Content words.txt | Where { $_ -eq -join $_[($_.length-1)..0] }
Pipingsemantik i PowerShell hjælper med at muliggøre komplekse scenarier med one-liner-programmer. Denne one-liner i PowerShell-script tager en liste med navne og tællinger fra en kommaadskilt værdifil og returnerer summen af tællingerne for hvert navn.
ipcsv .\fruit.txt –H F, C|Group F|%{@{"$($_.Name)"=($_.Group|measure C -sum).Sum}}|sort value
Se også
Referencer
eksterne links
- Perl Programmeringslinks
- Wikibooks Gratis Tcl Programmering introduktion og download pdf
- SourceForge , download websted og også flere computersprog
- Tcl Kilder , hoved -Tcl og Tk kildekode download websted
- Tcler's Wiki , Tcl/Tk scripts og reference clearing house
- TkDocs , Tcl/Tk Officiel dokumentation og arkiver