diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2023-02-13 05:44:19 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-02-13 05:44:19 +0000 |
| commit | d721480942ee2065d952474445d18dfd62a1780a (patch) | |
| tree | 48120e1f169b913bdda3c97668bbbf2dd480e478 /challenge-203 | |
| parent | b90ccc2f7d93eb27af91a0be747e2e819783fffe (diff) | |
| parent | 50a972935d2848c6f69e0de87c74cffc80d422ed (diff) | |
| download | perlweeklychallenge-club-d721480942ee2065d952474445d18dfd62a1780a.tar.gz perlweeklychallenge-club-d721480942ee2065d952474445d18dfd62a1780a.tar.bz2 perlweeklychallenge-club-d721480942ee2065d952474445d18dfd62a1780a.zip | |
Merge pull request #7557 from E7-87-83/newt
Week 203 Task 2
Diffstat (limited to 'challenge-203')
| -rw-r--r-- | challenge-203/cheok-yin-fung/perl/ch-2.pl | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/challenge-203/cheok-yin-fung/perl/ch-2.pl b/challenge-203/cheok-yin-fung/perl/ch-2.pl new file mode 100644 index 0000000000..5f20d3ace9 --- /dev/null +++ b/challenge-203/cheok-yin-fung/perl/ch-2.pl @@ -0,0 +1,49 @@ +# The Weekly Challenge 203 +# Task 2 Copy Directory +# Usage: perl ch-2.pl $source $target +use v5.30.0; +use warnings; + +my $source = $ARGV[0]; +my $target = $ARGV[1]; + +die "$source is not a directory" unless -d $source; +die "$target is not a directory" unless -d $target; + +# dir_walk taken from "Higher Order Perl" by Mark Jason Dominus + +sub dir_walk { + my ($top, $code, $dirname) = @_; + my $DIR; + + $code->($top, $dirname); + + if (-d $top) { + my $file; + unless (opendir $DIR, $top) { + warn "Couldn't open directory $top: $!; skipping.\n"; + return; + } + while ($file = readdir $DIR) { + next if $file eq "." || $file eq ".."; + dir_walk("$top/$file", $code, $file); + } + } +} + +sub copy_dir { + if ($_[1]) { + if (-d $_[0]) { + my $dirname = $_[1]; + my $reldir = substr($_[0], length($source)); + my $relpdir = reverse substr( + (reverse $reldir), index( + (reverse $reldir), "/" + ) + ); + `cd $target$relpdir && mkdir $dirname`; + } + } +} + +dir_walk($source, \©_dir); |
