首页 > 解决方案 > Perl 脚本(用于调用 Mac::AppleScript Perl 模块)

问题描述

我正在使用 shell 和 applescript 脚本设置一些自动化。我的几个模块需要将几个参数传递给 AppleScript。虽然有几种方法可以做到这一点,但一些研究将我引向了“Mac::AppleScript Perl 模块”,它看起来很有希望。但是,它需要在 /usr/local/bin 中有一个简短的 .pl 脚本。我发现的唯一示例有两个语法错误,而且我完全没有使用 Perl 的经验。

我已经尝试根据我在使用过的语言中使用的内容来猜测可能会引发错误的原因,但即使我可以识别出在某些地方没有扩展的变量,我尝试纠正它会导致进一步的错误我已经破解了几个小时。有人可以看看并告诉我我可以解决哪些语法问题吗?

#!/usr/bin/perl

use strict;
use Mac::AppleScript qw/ RunAppleScript /;

if( $#ARGV = 0) ? '"'.join('","',@ARGV).'"' : "";
my $rtn = RunAppleScript( "return run script alias ((POSIX file ""
    .$script.'") as text) with parameters {'.$args.'}' ),"n"
        or die "AppleScript Error: $!";

$rtn =~ s/(^"|"$)//g;
print $rtn,"n";

标签: perlapplescript

解决方案


问题:

  • "您的双引号字符串文字中有一个未转义的字符。
  • 您使用从未声明或初始化的变量。
  • 你的代码中有一个流浪,"n"者。
  • 您的代码存在代码注入错误。
  • 错误信息是在 中找到的$@,不是$!

固定的:

sub text_to_as_lit { '"'.( $_[0] =~ s/([\\"])/\\$1/rg ).'"' }  #'

my ($script, @args) = @ARGV;

my $rtn = RunAppleScript(sprintf(
   "return run script alias ((POSIX file %s) as text) with parameters {%s}",
   text_to_as_lit($script),
   ( join ',', map text_to_as_lit($_), @args ),
))
    or die("AppleScript Error: $@");

未经测试。


推荐阅读