gpt4 book ai didi

perl - 将带引号的字符串传递给system(),使引号保持完整

转载 作者:行者123 更新时间:2023-12-04 04:24:43 25 4
gpt4 key购买 nike

此问题适用于Windows 10上的Perl v5.24.0
除了最简单的情况。在程序之间传递命令行和参数列表始终是一个问题。考虑到空格和 shell 元字符的影响,可能使数据在多个级别的调用中保持完整,可能会导致一堆转义符和引号
Elixir 一直是使用system的多参数形式(它也尝试避免将shell称为中介),以便可靠地分隔每个参数而无需使用引号
这样的电话

system("dir \"C:\\Program Files\\\"")
这样写在眼睛上要容易得多
system('dir', 'C:\Program Files\\')
但是,我看不到任何传递包含引号的值的方法
如果我写一个测试程序
show.pl
use Data::Dump;
dd \@ARGV;
然后打电话
system('show', 'xxx')
那么我得到的输出就是我所期望的
["xxx"]
但是,假设我想传递字符串 "xxx"。如果我尝试
system('show', '"xxx"')
然后在该过程中的某些时候将引号除去,并且输出与前面的示例相同
如何调用 system以使输出为 ["\"xxx\""]
我已经尝试了各种逃避方法,但是解决方案使我回避了

最佳答案

问题:

system($^X, '-E', 'say @ARGV', '"test"');

输出:
test

太坏了![1]

解决方案:
use Win32::ShellQuote qw( quote_system );

system(quote_system($^X, '-E', 'say @ARGV', '"test"'));

输出:
"test"

  • 即使不使用Shell,Perl也需要构建命令行。与unix中执行程序的system call获取程序路径和参数列表不同,unix中执行程序的Windows system call采用命令行,因此即使避免使用shell,也必须构建命令行。似乎Perl错误地构建了命令行。[2]这就是为什么使用system BLOCK LIST语法无济于事的原因。
  • 实际上,由应用程序来解析命令行中的参数!值得庆幸的是,有一个system call可以做到这一点,因此就形成了一个标准。
  • 关于perl - 将带引号的字符串传递给system(),使引号保持完整,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38221923/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com