In article <[EMAIL PROTECTED]>, [EMAIL PROTECTED] (Doug McNutt) wrote:
> I just saw this on the AppleScript mailing list. > John is probably not a member of this list but I'll bet someone here can help > off list. > > Isn't there a module available? Yep. A few. > I've inherited a Perl script with a few routines invoking AS commands which, > being written a couple of years ago, expects to make the calls through > MacPerl. Needless to say, it breaks under OS X, but the client still wants > to use it. > > As you'll soon figure out, my Perl is pretty much limited to spelling its > name correctly, so I may be up against something trivial, but does anyone > know how I can rewrite the MacPerl calls to run straight through the included > Perl under OS X? The operative sections all look like this: > > { > > MacPerl::DoAppleScript(<<END_SCRIPT); > > tell application "$myApp" > [...] > end tell > > END_SCRIPT > } > > Thanks in advance, > -John DeYoung The module you want is "MacPerl". Yes, really. :-) It is included as part of the Mac-Carbon distribution for Mac OS X, which includes the MacPerl.pm module, and others that were formerly for Mac OS only. Other options include Mac::AppleScript with its RunAppleScript() function (that module was written before MacPerl.pm was ported to Mac OS X); and Mac::OSA::Simple, which is a more generic interface to OSA languages, and had an applescript() function. It also provides a way to compile an AppleScript for executing multiple times, or saving to disk, and can load compiled scripts from disk to execute. All three functions -- DoAppleScript(), RunAppleScript(), and applescript() -- function in essentially the same way. DoAppleScript() allows the most compatibility with MacPerl scripts. applescript() doesn't have significant advantages in its basic form, as it requires Mac-Carbon anyway, but offers some extra control. RunAppleScript()'s only real advantage, that I know of, is that it takes less to install, as Mac-Carbon is a fairly large and powerful distribution, and Mac-AppleScript just does this one thing. There is also calling osascript directly using ``, but that is more error prone and has no benefits of its own, apart from not needing to install additional modules. I personally don't consider that a significant benefit. If you are concerned about performance, all are suitable for most tasks, except for `osascript`. I ran some Jaguar benchmarks once (http://www.nntp.perl.org/group/perl.macperl/2748), and here's the result under Panther: #!/usr/bin/perl use strict; use warnings; use Benchmark qw(timethese cmpthese); use Mac::AppleScript 'RunAppleScript'; use MacPerl 'DoAppleScript'; use Mac::OSA::Simple 'applescript'; my $script = 'tell application "Finder" to get name of startup disk'; my %tests = ( applescpt => sub { applescript($script) }, doscript => sub { DoAppleScript($script) }, runscript => sub { RunAppleScript($script) }, osascript => sub { `osascript -ss -e '$script'` } ); my $results = timethese(500, \%tests); cmpthese($results); ===== Benchmark: timing 500 iterations of applescpt, doscript, osascript, runscript... applescpt: 4 wallclock secs ( 1.70 usr + 0.29 sys = 1.99 CPU) @ 251.26/s (n=500) doscript: 2 wallclock secs ( 1.11 usr + 0.18 sys = 1.29 CPU) @ 387.60/s (n=500) osascript: 240 wallclock secs ( 0.17 usr 2.34 sys + 108.88 cusr 48.57 csys = 159.96 CPU) @ 199.20/s (n=500) runscript: 21 wallclock secs ( 6.22 usr + 6.91 sys = 13.13 CPU) @ 38.08/s (n=500) Rate runscript osascript applescpt doscript runscript 38.1/s -- -81% -85% -90% osascript 199/s 423% -- -21% -49% applescpt 251/s 560% 26% -- -35% doscript 388/s 918% 95% 54% -- ===== As noted previously: I don't know why RunAppleScript is a bit slower, and osascript is slower because it needs to call out to the shell. The comparison table is deceptive for osascript because it only shows usr+sys, not the rest. Summary: I recommend installing Mac-Carbon, adding "use MacPerl;" to the script, and using it as-is. If you don't want to install all of Mac-Carbon, Mac-AppleScript is your best bet. Stay away from osascript. Cheers, -- Chris Nandor [EMAIL PROTECTED] http://pudge.net/ Open Source Development Network [EMAIL PROTECTED] http://osdn.com/