如何调用传递给被调用程序的 VAR=$VAL 的系统?

How to call system with VAR=$VAL passed to called program?

我在 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,我应该对标量变量使用美元符号。搜索 "how to pass a scalar variable through system" 之类的术语会一直返回到 Stack Overflow 问答。

尝试使用 '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"});

可以在 Quote and Quote like Operators 上的文档中找到更多详细信息。