Innstiller til Ten Short, Nyttig Perl programmer

July 23  by Eliza

Noen mennesker tror at korte programmer er ikke bra for veldig mye, men det er ikke så med Perl. Bare et par linjer med Perl-kode kan gå en lang vei. Denne artikkelen viser noen praktisk teeny, bittesmå Perl programmer.

Samle unike linjer

Hvis tekstfilen har mange linjer som er duplikater, og du bare ønsker å se de unike linjer, kan du samle dem inn i en matrise (i dette tilfellet, det heterUnique) med følgende program:

åpen (IN, "somefile.txt"); @ Unik = ();
while (<I>) {mindre ($ i {$ _} ++) {skyv (Unique, $ _)}}

Trikset her er at $ i {$ _} ++ returnerer 0 første gang du oppretter en nøkkel-verdi-par med $ _ som nøkkelen, og noen annen verdi enn null etter det.

Bli kvitt flere tomme linjer

Noen tekstfiler har flere påfølgende tomme linjer, som gjør dem vanskelig å lese, spesielt på små skjermer. Følgende program skriver ut en tekstfil, komprimere alle forekomster av to eller flere blanke linjer inn i en tom linje.

Merk: En blank linje kan ha blanke tegn i den, for eksempel mellomrom og faner, men ingen synlige tegn.

åpen (IN, "somefile.txt"); $ PrevBlank = 0;
while (<I>) {
if (/ \ S / eller! $ PrevBlank) {print $ _}
$ PrevBlank = / ^ \ s * $ /;
}

Hvis setningen i foregående eksempel er sant hvis det er blank tegn på linjen, eller hvis den forrige linjen var ikke blank. The $ PrevBlank oppdraget forteller deg om den aktuelle linjen er blank, noe som betyr at den har null eller flere blanke tegn og ingenting annet.

Skrive linjer fra en fil i sortert rekkefølge

Det er lett å glemme hvor nyttig Perl sorteringsfunksjonen er. Følgende program leser hele filen inn i en matrise, sorterer tabellen, og skriver ut resultatet. Kort og konsis, og ganske effektiv til boot:

åpen (IN, "somefile.txt");
print sort (<I>);

Skrive ut et utvalg av linjer fra en fil

Har du noen gang ønsket å lese bare noen få linjer fra en fil, og ikke hele greia? Følgende program utskrifter bare et utvalg av linjer. Du kjører programmet med to argumenter: området du ønsker og filnavnet. For eksempel, hvis du navnet ditt program "Showline" og du vil se linjene 10 til 20 av somefile.txt filen, bruker du denne kommandolinjen:

Showline 10-20 somefile.txt

Følgende program skriver ut en rekke linjer:

åpen (IN, $ ARGV [1]) eller dø "Kunne ikke lese $ File \ n.";
($ Start, $ stopp) = split (/ - /, $ ARGV [0]);
for ($ i = 1; $ i <= $ Stopp; $ i + = 1)
{$ Linje = <I>; if ($ i> = $ Start) {print $ Linje}}

Oppføring bare filene i en katalog

Til tider kan det være lurt å ignorere underkataloger i en katalog og bare fokusere på filene. Du kan bruke følgende -f fil test for å liste opp alle filene i en katalog:

foreach $ f (<*>) {if (-f $ f) {print "$ f \ n"}}

Oppføring en katalog av størrelse

Til å sortere, en katalogoppføring av noe annet enn sine filnavn, har programmet til å holde en liste over poster som består av navn og andre elementer i oppføringen. Hashes er flott å bruke for denne type liste som har poster med en nøkkel (filnavnet) og en verdi (den andre kataloginformasjon). Følgende program skaper en hash som viser størrelsen på hver fil i katalogen og deretter sorterer elementene for utgang. (Du kan enkelt endre dette programmet for å sortere etter dato i stedet for etter størrelse.)

foreach $ f (<*>) {$ i {$ f} = -s $ f};
foreach $ k (sort {$ i {$ b} <= & gt $ i {$ a}} tastene% i)
{Printf "% 8d% s \ n", $ i {$ k}, $ k}

Sortering kataloger ved forlengelse

Sortering av en del av et filnavn er en litt vanskeligere prosess enn sortering av filstørrelse eller etter datoen filen ble endret. Følgende program bryter filnavnet i to og sorterer etter den andre delen. Hvis du kjører Perl på en UNIX eller Macintosh-system, fungerer dette programmet forutsigbart bare hvis filnavnene har ingen periode eller én periode:

foreach $ Fullname (<*>) {
(Navn $, $ Ext) = split (/\./, $ Fullname, 2);
skyv (Temp, "$ Ext \ t $ Fullname");
}
foreach $ Val (sort (Temp)) {
($ Ext, $ Fullname) = split (/ \ t /, $ Val);
skrive "$ Fullname \ n";
}

Lage en enkel kalkulator

Noensinne trengte en enkel å bruke kalkulator for å kutte ut noen quick-and-dirty matte? Følgende program bruker Perl eval funksjonen for å skrive ut svarene til en ligning du skriver inn. For å avslutte programmet, skriv en blank linje. Her er det program for å lage din egen kalkulator:

while (<STDIN>) {
$ I = $ _; chomp ($ i); med mindre ($ i) {siste}
$ O = eval ($ i); print "Svar = $ o \ n";
}

Når du kjører programmet, kan du skrive inn noe sånt som følgende:

((2 ** 8) + (3 ** 8))

og du får dette resultatet:

Answer = 6817

Randomisering en liste

I Perl, er lett å generere slumptall, men randomisering rekkefølgen av en matrise er ikke så enkel. Likevel, kan du bruke skjøte funksjon å trekke et tilfeldig element fra en matrise og deretter plassere elementet i en annen rekke. Følgende program randomiserer listenMyList:

minTempList = ();
while (MyList)
{Skyv (TempList, spleise (MyList, rand (MyList), 1))}
MyList =TempList;

Trikset her er at rand (MyList) plukker et tall mellom 0 og antall elementer iMyList, og spleise endrer dette tilfeldig tall til et heltall.

Generere tilfeldige mnemonic passord

Prøver å overbevise databrukere å komme opp med passord som ikke er lett å gjette er en av de mest utfordrende arbeidsplasser for en systemadministrator. Folk har alltid synes å insistere på å bruke sine fødsels eller kjæledyr navn for passord - brudd sikkerhet blir da en lek.

Følgende program genererer tilfeldige passord. I stedet for et virvar av vanskelige å huske bokstaver, men passordene er noe mnemonic fordi de opptrer i par med konsonanter og vokaler som er pronounceable. Ved å sette sammen et par klønete-klingende stavelser, kan du generere enkle å huske tull setninger.

Hver stavelse av passord kan representere en av 100 numre; derfor en enkelt fire-stavelse passord, slik som votahubo, er en av 100 millioner (100 til fjerde potens) mulige passord programmet genererer. Å ha et system administrator tildele disse passordene gir mer sikkerhet enn å la brukerne velge sine egne, lett å gjette passord:

skrive ut "Enter et frø Nummer:"; $ S = <STDIN>;
srand ($ s ^ tid);
@ C = split (/ * / "bcdfghjklmnprstvwxyz");
@ V = split (/ * /, "aeiou");
for ($ i = 1; $ i <= 4; $ i + = 1)
{Print $ c [int (rand (20))], $ v [int (rand (5))]}

De to første linjene av dette programmet initial frøet for tilfeldige tall, og de ​​neste to linjer lage lister som inneholder de 20 konsonanter (minus q) og fem vokaler i alfabetet. For loop skriver rett og slett de fire stavelser.