/ 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
En lille rekursiv rutine
Fra : henrik jensen


Dato : 25-08-03 21:45

Hej,
jeg har en server som jeg ønsker at vedligeholde ved noget daglig
opdatering. Dels skal der slettes nogle filer der automatisk dannes når
den tilgås fra en Mac, dels skal der placeres nogle php-filer som bruges
når filtræet tilgås via web.

Opgaven lyder:
cd til /den/paagaeldende/sti
slet evt. forekomster af .DS_Store
hvis index.php ikke er her, så kopier den fra /sti/til/index.php
gør det samme for alle underliggende kataloger

Er der nogen her, der har et bud hvordan dette gøres?
Jeg er ikke fast besluttet på at det skal gøres med perl, men ved at
bruge perl kan jeg vel gå ud fra, at det også vil virke hvis jeg en dag
får et nyt OS med et andet shell...

Systemet er iøvrigt FreeBSD 4.3

Enhver hjælp modtages med tak - inklusive hints og links til online
guides

Mvh
henrik (total perl-newbie)


 
 
Lars Balker Rasmusse~ (25-08-2003)
Kommentar
Fra : Lars Balker Rasmusse~


Dato : 25-08-03 22:09

henrik jensen <hj@netwerk.dk> writes:
> Opgaven lyder:
> cd til /den/paagaeldende/sti
> slet evt. forekomster af .DS_Store
> hvis index.php ikke er her, så kopier den fra /sti/til/index.php
> gør det samme for alle underliggende kataloger

use IO::Dir;
use File::Copy;

my $phppath = "/sti/til/index.php";
my $start = "/den/paagaeldende/sti";

doit $start;

sub doit {
my $path = shift;

chdir $path or die "chdir: $!";

unlink ".DS_Store";

unless (-f "index.php") {
copy($phppath, "index.php");
}

my $dir = new IO::Dir "." or die "opendir: $!";

my $newdir;
while (defined($newdir = $dir->read)) {
next unless -d $newdir;
next unless $newdir =~ /^..?$/;
doit $newdir;
}

chdir "..";
}

(Jeg kedede mig - dog ikke nok til at ovenstående er testet, men det
virker sikkert )
--
Lars Balker Rasmussen Consult::Perl

Lars Balker Rasmusse~ (25-08-2003)
Kommentar
Fra : Lars Balker Rasmusse~


Dato : 25-08-03 22:21

Lars Balker Rasmussen <lars@balker.org> writes:
> while (defined($newdir = $dir->read)) {
> next unless -d $newdir;
> next unless $newdir =~ /^..?$/;

Der var jeg lige hurtig nok...

next if $newdir =~ /^..?$/;

og doit kaldene skal have ()'er omkring argumentet.

> (Jeg kedede mig - dog ikke nok til at ovenstående er testet, men det
> virker sikkert )

Ak ja.
--
Lars Balker Rasmussen Consult::Perl

henrik jensen (25-08-2003)
Kommentar
Fra : henrik jensen


Dato : 25-08-03 23:08

Lars Balker Rasmussen wrote:

>>(Jeg kedede mig - dog ikke nok til at ovenstående er testet, men det
>>virker sikkert )
>
>
> Ak ja.

Det var sørme hurtigt. Tak skal du have!
Jeg vil straks i aften (øh, nat) se om jeg kan få det til at virke


Mvh
Henrik


Lasse Hillerøe Peter~ (26-08-2003)
Kommentar
Fra : Lasse Hillerøe Peter~


Dato : 26-08-03 08:30

In article <0fekz9e97j.fsf@laphroaig.balker.org>,
Lars Balker Rasmussen <lars@balker.org> wrote:

> henrik jensen <hj@netwerk.dk> writes:
> > Opgaven lyder:
> > cd til /den/paagaeldende/sti
> > slet evt. forekomster af .DS_Store
> > hvis index.php ikke er her, så kopier den fra /sti/til/index.php
> > gør det samme for alle underliggende kataloger

[30 linier Perl -> /bit/bucket]

> (Jeg kedede mig - dog ikke nok til at ovenstående er testet, men det
> virker sikkert )

Jeeez. Du må *virkelig* ha' kedet dig. POSIX sh:

find /den/paagaeldende/sti -type d -print|while read p ; do rm -f
$p/.DS_Store ; test -f $p/index.php || cp /sti/til/index.php $p ; done

Hvis man endelig *vil* insistere på at implementere det i Perl, bør man
nok bruge File:Find. Så slipper man også for at poste en followup til
sig selv fordi man har reimplementeret find forkert.

-Lasse
[Som også er for doven til at ovenstående one-liner er testet.]

henrik jensen (26-08-2003)
Kommentar
Fra : henrik jensen


Dato : 26-08-03 10:09

Lasse Hillerøe Petersen wrote:

> Jeeez. Du må *virkelig* ha' kedet dig. POSIX sh:

Ikke desto mindre fungerer scriptet jo perfekt, og det afvikles med en
helt fin hastighed, synes jeg.

> find /den/paagaeldende/sti -type d -print|while read p ; do rm -f
> $p/.DS_Store ; test -f $p/index.php || cp /sti/til/index.php $p ; done

Vi er godt nok lidt off-topic nu, men hvilket shell skal jeg bruge for
at køre denne kode (jeg bruger normalt tcsh, men har absolut meget lidt
erfaring med scripting i dette miljø)?
Jeg er ikke helt med på while-løkkens struktur - er det do og done
(efter et ';') der fortæller hvor løkken starter og stopper?
Hvor kan jeg læse mere om denne type scripts?

> -Lasse
> [Som også er for doven til at ovenstående one-liner er testet.]

/Henrik
[som mest er vant til at kode i php, men det er vist ikke så populært
her ]


Lasse Hillerøe Peter~ (26-08-2003)
Kommentar
Fra : Lasse Hillerøe Peter~


Dato : 26-08-03 12:16

In article <8tF2b.57486$Kb2.2571982@news010.worldonline.dk>,
henrik jensen <hj@netwerk.dk> wrote:

> Lasse Hillerøe Petersen wrote:
>
> > Jeeez. Du må *virkelig* ha' kedet dig. POSIX sh:
>
> Vi er godt nok lidt off-topic nu, men hvilket shell skal jeg bruge for

Gentager: POSIX sh. Fx /bin/sh, /bin/ksh, /gnu/bin/bash.... Jeg bruger
selv pdksh (std /bin/ksh i NetBSD), men såvel bash som zsh burde være
brugbare POSIX sh'er.

> at køre denne kode (jeg bruger normalt tcsh, men har absolut meget lidt

Læs vores allesammens perl.com-yndlingsflamer Tom Christiansens eminente
artikel _Csh programming considered harmful_
<http://www.perl.com/pub/a/language/versus/csh.html>

Selv overvejer jeg at kigge på zsh, som skulle have mere intelligent
completion, ala tcsh. Når jeg bruger ksh, er det fordi jeg selv skiftede
fra tcsh samtidig med at jeg skiftede fra A/UX til IRIX. På IRIX er
/bin/sh Korn shell. Det samme gælder for øvrigt AIX og HP-UX.

> Jeg er ikke helt med på while-løkkens struktur - er det do og done
> (efter et ';') der fortæller hvor løkken starter og stopper?

Korrekt. ";" er en alternativ separator, I en script-fil ville man
typisk formatere med newlines og indrykning, uden semikolon:

while [ /bin/true ] ; do
bash Microsoft
done

(Jeg foretrækker 'do' på samme linie som while, den ortodokse skrivemåde
ville placere 'do' på en linie for sig.)

> Hvor kan jeg læse mere om denne type scripts?

$ man sh

Det er forbløffende som så mange wannabe-Unix-hajer ikke kan deres
shell, og gladeligt skriver 30-liniers perlscripts som kan klares med en
shell-oneliner.

-Lasse

Thorbjoern Ravn Ande~ (26-08-2003)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 26-08-03 20:06

Lasse Hillerøe Petersen <lhp+news@toft-hp.dk> writes:

> Selv overvejer jeg at kigge på zsh, som skulle have mere intelligent
> completion, ala tcsh. Når jeg bruger ksh, er det fordi jeg selv skiftede
> fra tcsh samtidig med at jeg skiftede fra A/UX til IRIX. På IRIX er
> /bin/sh Korn shell. Det samme gælder for øvrigt AIX og HP-UX.

Køb en Mac. Der er standardskallen en tcsh - jeg blev helt nostalgisk
og mindedes mine glade studiedage. Siden har jeg levet med
forskellige varianter af bash fordi det er det man får, og jeg har et
princip om at skulle sætte absolut minimalt op.

> > Hvor kan jeg læse mere om denne type scripts?
>
> $ man sh

Nu er du ikke flink. På biblioteket har de formentlig dybt igemmerne
en dansk bog om UNix som også omhandler sh-programmering.

> Det er forbløffende som så mange wannabe-Unix-hajer ikke kan deres
> shell, og gladeligt skriver 30-liniers perlscripts som kan klares med en
> shell-oneliner.

Så vidt jeg husker er hverken find, rm, eller cp indbyggede i /bin/sh,
så hvorfor fyre op under fire forskellige programmer når man kan nøjes
med perl?

(Nu venter vi stille og roligt på at folk begynder at diskutere
vi-makroer versus Emacs Lisp)...
--
Thorbjørn Ravn Andersen
http://unixsnedkeren.dk/ravn

Lars Balker Rasmusse~ (26-08-2003)
Kommentar
Fra : Lars Balker Rasmusse~


Dato : 26-08-03 12:30

Lasse Hillerøe Petersen <lhp+news@toft-hp.dk> writes:
> In article <8tF2b.57486$Kb2.2571982@news010.worldonline.dk>,
> henrik jensen <hj@netwerk.dk> wrote:
>> at køre denne kode (jeg bruger normalt tcsh, men har absolut meget lidt
>
> Læs vores allesammens perl.com-yndlingsflamer Tom Christiansens eminente
> artikel _Csh programming considered harmful_
> <http://www.perl.com/pub/a/language/versus/csh.html>

Bah, tcsh er en glimrende SHELL.

> Det er forbløffende som så mange wannabe-Unix-hajer ikke kan deres
> shell, og gladeligt skriver 30-liniers perlscripts som kan klares med en
> shell-oneliner.

Prøv at læse henriks første artikel igen - perl-scriptet virker på
alle/de fleste OS'er, ikke kun j00nix.
--
Lars Balker Rasmussen Consult::Perl

Lasse Hillerøe Peter~ (26-08-2003)
Kommentar
Fra : Lasse Hillerøe Peter~


Dato : 26-08-03 13:58

In article <0fwud0d5bm.fsf@laphroaig.balker.org>,
Lars Balker Rasmussen <lars@balker.org> wrote:
> Bah, tcsh er en glimrende SHELL.

Tsk, tsk.

> Prøv at læse henriks første artikel igen

Huh? Hvad er der nu galt med FreeBSD?

> - perl-scriptet virker på
> alle/de fleste OS'er, ikke kun j00nix.

Perl-scriptet virker hvis Perl er installeret. De færreste OS'er har
Perl installeret som default, men alle Unix'er har en Bourne eller POSIX
shell. Mht MicrosoftOS'er, så er man dels selv ude om det, dels kan det
vel være ligegyldigt om man skal installere ActiveState Perl eller
CygWin. Ikke at jeg vil foregive at vide en snus om det, jeg prøver
ihærdigt at glemme den lille smule jeg ved om MicrosoftOS'er.

-Lasse

Lars Balker Rasmusse~ (26-08-2003)
Kommentar
Fra : Lars Balker Rasmusse~


Dato : 26-08-03 20:11

Thorbjoern Ravn Andersen <nospam0000@unixsnedkeren.dk> writes:
> Så vidt jeg husker er hverken find, rm, eller cp indbyggede i /bin/sh,
> så hvorfor fyre op under fire forskellige programmer når man kan nøjes
> med perl?

Det er faktisk en anden god pointe. Lasses find|read går ganske
effektivt i stykker hvis der er mellemrum i filnavnene. Perl er
fløjtende ligeglad.
--
Lars Balker Rasmussen Consult::Perl

Lasse Hillerøe Peter~ (26-08-2003)
Kommentar
Fra : Lasse Hillerøe Peter~


Dato : 26-08-03 21:35

In article <0f7k50cjz6.fsf@laphroaig.balker.org>,
Lars Balker Rasmussen <lars@balker.org> wrote:

> Thorbjoern Ravn Andersen <nospam0000@unixsnedkeren.dk> writes:
> > Så vidt jeg husker er hverken find, rm, eller cp indbyggede i /bin/sh,
> > så hvorfor fyre op under fire forskellige programmer når man kan nøjes
> > med perl?

dog:/tmp $ echo "z" >foo
dog:/tmp $ time perl -MFile::Copy -e '$i=1000; while($i--) { copy("foo",
"bar");}'
0.79s real 0.22s user 0.44s system
dog:/tmp $ time (for i in $(jot 1000) ; do cp foo bar ; done)
3.61s real 0.20s user 1.31s system

OK, det koster måske nogle ekstra sekunder at være doven. So what? Hvis
det virkelig skulle gå stærkt, kunne man overveje C eller føromtalte
File::Find. I øvrigt er der så vidt jeg kan tælle kun tre fork-execs pr
iteration. Det er som altid en tradeoff som kun kan afgøres af de
nærmere omstændigheder. Enten er det så hurtigt at de ekstra sekunder
ikke betyder så meget, eller også tager det alligevel så lang tid at det
kan være lidt lige meget (fordi det alligevel bare kører som et cronjob
sent om natten.) Derimellem er der så en gråzone hvor "det kommer an på".

> Det er faktisk en anden god pointe. Lasses find|read går ganske
> effektivt i stykker hvis der er mellemrum i filnavnene. Perl er
> fløjtende ligeglad.

Åh herregud da, her er en flok anførselstegn: """"""""""""""""" . Sæt
dem selv ind hvor de mangler. (Det kan være der er en for lidt eller et
par i overskud.)

Nu vil I måske indvende, at det går i stykker ved \n i filnavne, bare
for at tvinge mig til at demonstrere brugen af -print0?

Hvordan er det liiiige Perls "open" har det med filnavne der starter med
">", med mindre man koder defensivt?

-Lasse

Thorbjoern Ravn Ande~ (27-08-2003)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 27-08-03 08:37

Lasse Hillerøe Petersen <lhp+news@toft-hp.dk> writes:

> dog:/tmp $ time perl -MFile::Copy -e '$i=1000; while($i--) { copy("foo",
> "bar");}'
> 0.79s real 0.22s user 0.44s system
> dog:/tmp $ time (for i in $(jot 1000) ; do cp foo bar ; done)
> 3.61s real 0.20s user 1.31s system
>
> OK, det koster måske nogle ekstra sekunder at være doven. So what? Hvis

En interessant forklaring på en faktor 4 i afviklingstid :)

> Hvordan er det liiiige Perls "open" har det med filnavne der starter med
> ">", med mindre man koder defensivt?

Ikke noget problem. ">" er ikke et gyldigt tegn på FAT-filsystemer.

--
Thorbjørn Ravn Andersen
http://unixsnedkeren.dk/ravn

Adam Sjøgren (26-08-2003)
Kommentar
Fra : Adam Sjøgren


Dato : 26-08-03 21:38

On Tue, 26 Aug 2003 22:35:11 +0200, Lasse wrote:

> Nu vil I måske indvende, at det går i stykker ved \n i filnavne,
> bare for at tvinge mig til at demonstrere brugen af -print0?

Hvorefter vi slår dig i hovedet med "POSIX", right?

> Hvordan er det liiiige Perls "open" har det med filnavne der starter
> med ">", med mindre man koder defensivt?

Gjorde Lars' script det?


Mvh.

--
"Some people like cupcakes better. Adam Sjøgren
I for one care less for them!" asjo@koldfront.dk

Peter Makholm (26-08-2003)
Kommentar
Fra : Peter Makholm


Dato : 26-08-03 21:50

Thorbjoern Ravn Andersen <nospam0000@unixsnedkeren.dk> writes:

> Køb en Mac. Der er standardskallen en tcsh - jeg blev helt nostalgisk
> og mindedes mine glade studiedage. Siden har jeg levet med

Apple ser ud til at være kommet til fornuft. http://apple.slashdot.org
skriver i hvert fald:

gklinger writes "AppleInsider is reporting that Apple has switched
from tcsh to bash in the the latest developer build (7B44) of Mac OS
X 10.3 (Panther).

Om tcsh, ksh, zsh eller bash er bedst til interaktivt brug ved jeg
ikke. Personligt synes jeg at det er nok med et scriptingsprog i
shell-klassen og det er altså bourne shell, derfor skal min
interaktive shell også bruge bourne shell. Om det så lige er bash er
jeg ligeglad med. Jeg tror faktisk at jeg bruger tre forskellige på
forskellige maskiner.

--
Peter Makholm | The four letter word beginning with L?
peter@makholm.net | It's life, love, libc or lisp
http://hacking.dk | -- Depending on you point of view

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

Månedens bedste
Årets bedste
Sidste års bedste