将给定给perl函数的所有实际参数视为标量

将给定给perl函数的所有实际参数视为标量,perl,command,Perl,Command,我有一个perl脚本generator.pl,它定义了一些例程,如: sub a($) { ... print FILE "$_[0]"; ... } ... sub b($$) { ... print FILE "$_[0], $_[1]"; ... } ... $subsfile = $ARGV[0] . "/subs.pl"; $generatedfile = $ARGV[0] . "/generated.file"; open FILE, '>>

我有一个perl脚本
generator.pl
,它定义了一些例程,如:

sub a($) {
 ...
 print FILE "$_[0]";
 ...
}    

 ...

sub b($$) {
 ...
 print FILE "$_[0], $_[1]";
 ...
}
 ...

$subsfile = $ARGV[0] . "/subs.pl";
$generatedfile = $ARGV[0] . "/generated.file";

open FILE, '>>', "$generatedfile" or die "error trying to append: $!";
do "$subsfile";
close FILE;
让我们假设,例如
subs.pl
如下:

a(1);
a(x);
b(1-2, z);
b(1-x, i);
b(y-z, j);
我以这种方式调用
生成器脚本

C:\Users\Me>perl generator.pl "D:/another/path"
结果是创建了另一个/path/generated.file,但它包含0个字节。打印
“print$@;”
do语句之后,我获得:

Transliteration pattern not terminated at...
如果我试图用一个
subs.pl
调用脚本,并将每个实际参数都双引号引起来

它起作用了

如果不使用双引号,如何使事情正常工作?

tr//
也可以写成
y//
。此外,它还可以修改为使用另一个字符作为分隔符,即
y---

所以当perl看到这样的东西时

b(y-z, j);
它期望

b(y-z, j--);
这是正确的,在上面的示例中,它将计算默认变量
$\uuu
中出现的所有
z
j
字符,并将其作为参数传递给
b()

由于没有满足编译器的期望,它抛出:

音译模式未终止于


因此,您想知道为什么,例如
perl-e'1-x'
不编译,而
perl-e'1-x'
编译?也许我读到了解决方案。事实上,我从linux迁移到windows,在linux下它精确地工作了。我调用的例程存储在文件
subs.pl
中。假设可以这样调用这个例程:
perl-ea()
perl-eb(,)
,在linux中,它正在工作(这意味着它正在编译)调用它们
perl-ea(2)
perl-eb(1-5,x)
。Linux和windows版本的Perl之间没有明显的区别。当然,没有额外的“linux下的精度”
b(1-x,i)
永远不会在任何版本的Perl下编译,但它不会生成错误
未终止的音译模式
。您根本没有显示任何音译实例,因此无法提出解决方案。+1用于显示未终止的
音译模式的来源。
b(y-z, j--);