2016-10-01 41 views
1

我在Windows 7上使用Strawberry Perl(最新版​​本)(已完全修补)。我试图调用nmake来编译一个库。 makefile是好的,我手动使用它。接下来我想自动化它。

我无法获得一些正确的Perl。我有以下几点:

#!/usr/bin/env perl 

use strict; 
use warnings; 

my $DEBUG32_CXXFLAGS="/DDEBUG"; 

system('nmake', '/f', 'cryptest.nmake', 'CXXFLAGS="$DEBUG32_CXXFLAGS"'); 

它导致:

 cl.exe EBUG32_CXXFLAGS /Yc"pch.h" /Fp"pch.pch" /c pch.cpp 
Microsoft (R) C/C++ Optimizing Compiler Version 16.00.40219.01 for x64 
Copyright (C) Microsoft Corporation. All rights reserved. 

cl : Command line warning D9024 : unrecognized source file type 'EBUG32_CXXFLAGS 
', object file assumed 
cl : Command line warning D9027 : source file 'EBUG32_CXXFLAGS' ignored 
pch.cpp 
     cl.exe EBUG32_CXXFLAGS /c cryptlib.cpp 

how to pass arguments to system command in perl,我应该使用美元符号的标量变量。搜索诸如“如何通过系统传递标量变量”这样的术语始终引导回堆栈溢出问题和答案。

试图使用变体(如'CXXFLAGS="DEBUG32_CXXFLAGS"','CXXFLAGS="${DEBUG32_CXXFLAGS}"'等)会导致类似的Perl中断。

我使用单引号,因为system(nmake, /f, cryptest.nmake);system("nmake", "/f", "cryptest.nmake")未按预期工作。这些接近于引用的问题和答案。

最终我需要通过一个真实姓名值对。这将更接近像DEBUG_CXXFLAGS = /nologo /W4 /wd4511 /D_MBCS /Zi /TP /GR /EHsc /MD /FI sdkddkver.h /FI winapifamily.h

我如何调用系统与VAR=$VAL作为参数传递给被调用的程序?

在此先感谢


> perl.exe --version 

This is perl 5, version 22, subversion 1 (v5.22.1) built for MSWin32-x64-multi-thread 
+0

给你使用的Perl的版本号会好得多。 “最新”从来没有非常明确(最新版本是v5.25.5,但我怀疑你是否使用了这个版本),而且这个问题很可能会在很多新版本的Perl 5发布后出现。 – Borodin

回答

3

变量在双引号字符串只得到扩展。您可以在不包含变量的参数周围使用单引号,但您需要切换到双引号。

接下来的问题是,您希望在使用双引号作为分隔符的字符串中包含双引号字符。为了实现这一目标,使用反斜杠字符转义字符串内的每个双引号:

my $DEBUG32_CXXFLAGS="/DDEBUG"; 

system('nmake', '/f', 'cryptest.nmake', "CXXFLAGS=\"$DEBUG32_CXXFLAGS\""); 

另一种方法是使用qq双引号操作符提供你需要的变量代换双引号背景下,却能让你选择了分隔符。在这个例子中我选择使用大括号来分隔字符串:

system('nmake', '/f', 'cryptest.nmake', qq{CXXFLAGS="$DEBUG32_CXXFLAGS"}); 

更多细节可以在文档中找到的Quote and Quote like Operators

+0

该死的,就是这样。我非常沮丧,我想尖叫。我有更糟糕的时间用*“这里是规则”*然后*“这里是您违反规则的事情,因为当您遵循规则时,事情不起作用”*。脚本语言更糟... – jww

+0

@jww,没有规则被违反。这两种引用简单地具有不同的功能。这不是“脚本语言”的属性。例如,单引号与C中的双引号不同,单引号相当于JavaScript中的双引号。 – ikegami

+0

@jww单引号字符串如何工作以及双引号字符串如何工作的区别是Perl从Unix命令shell约定继承的东西。我想如果你在那个世界有经验,但如果你没有经验,这可能就没有意义。 –