http://www.perlmonks.org?node_id=1030774

taint has asked for the wisdom of the Perl Monks concerning the following question:

Greetings,
In an effort to figure out how to perform the equivalent of this shell script:
find ./iso/ -type f -cmin '+11' -uid web -exec rm '{}' \;
using Perl. I made use of one of the Perl utilities, find2perl. After reading it's syntax, I used what I understood to be the equivalent:
find2perl ./iso/ -iname '*.xz' -user web -ctime 1 -exec rm '{}' \;
-- with 2 exceptions;
1) I added -iname '*.xz'
2) I was unable to define time in minutes, as only -ctime is available, which == day(s).
I had expected a similarly short equivalent to be returned upon execution. But much to my surprise, I received the following:
#! /usr/local/bin/perl -w eval 'exec /usr/local/bin/perl -S $0 ${1+"$@"}' if 0; #$running_under_some_shell use strict; use File::Find (); # Set the variable $File::Find::dont_use_nlink if you're using AFS, # since AFS cheats. # for the convenience of &wanted calls, including -eval statements: use vars qw/*name *dir *prune/; *name = *File::Find::name; *dir = *File::Find::dir; *prune = *File::Find::prune; sub wanted; my (%uid, %user); while (my ($name, $pw, $uid) = getpwent) { $uid{$name} = $uid{$uid} = $uid; } # Traverse desired filesystems File::Find::find({wanted => \&wanted}, './iso/'); exit; sub wanted { my ($dev,$ino,$mode,$nlink,$uid,$gid); (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) && /^.*\.xz\z/si && ($uid == $uid{'web'}) && (int(-C _) == 1) && (unlink($_) || warn "$name: $!\n"); }
Is this right?!
I'm not going to pretend to be a Perl GURU -- far from it. But even after removing the comments, this seems to inefficient -- no?
Anyway, if this is really the best option to perform such a short task in a shell with Perl. It looks to me that "shelling out" within Perl is more efficient -- minus Taint, of course.

Thank you for any consideration in this matter.

--chris

#!/usr/bin/perl -Tw
use perl::always;
my $perl_version = "5.12.4";
print $perl_version;