我在Windows 7上使用了Strawberry Perl(最新版本)(已完全修补)。 我试图调用nmake来编译一个库。 生成文件是好的,我手动使用它。 接下来我想自动化它。
我无法得到一些正确的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
根据如何在perl中将parameter passing给系统命令 ,我应该使用美元符号作为标量variables。 search诸如“如何通过系统传递标量variables”等术语不断引导回堆栈溢出问题和答案。
试图使用变化,如'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
变量只能用双引号字符串扩展。 您可以在不包含变量的参数周围使用单引号,但是您需要切换到双引号。
接下来的问题是,你希望在使用双引号作为分隔符的字符串中包含一个双引号字符。 为了达到这个目的,使用反斜线字符来转义字符串中的每个双引号:
my $DEBUG32_CXXFLAGS="/DDEBUG"; system('nmake', '/f', 'cryptest.nmake', "CXXFLAGS=\"$DEBUG32_CXXFLAGS\"");
另一种方法是使用qq双引号运算符,它提供了可变插值所需的双引号上下文,但允许您选择分隔符。 在这个例子中,我选择使用大括号来分隔字符串:
system('nmake', '/f', 'cryptest.nmake', qq{CXXFLAGS="$DEBUG32_CXXFLAGS"});
更多细节可以在像运营商报价和报价文档中找到。