【问题标题】:Strawberry Perl - Search and replace in Windows草莓Perl - 在Windows中搜索和替换
【发布时间】:2019-10-14 17:21:24
【问题描述】:

我正在尝试执行以下命令:

perl -pi -e 's,vaadin-element,color-picker,g' *.* demo/* test/* src/* theme/*/*
(在this 文档之后)

不幸的是,我使用的pearl的窗口分布似乎与命令有一些问题,因为我收到以下错误:

Can't open *.*: Invalid argument.
Can't open demo/*: Invalid argument.
Can't open test/*: Invalid argument.
Can't open src/*: Invalid argument.
Can't open theme/*/*: Invalid argument.

关于如何解决这个问题的任何建议? 提前谢谢!

免责声明:我以前从未使用过珍珠,也完全没有经验。

【问题讨论】:

  • 在 Cygwin 终端上似乎可以正常工作,我猜您正在使用命令提示符?
  • @Håkon Hægland,Cygwin 是一个模拟 unix 的环境;你不能把它想象成 Windows。
  • @ikegami 好的,谢谢,我是 Windows 术语的新手 :)

标签: windows perl replace strawberry-perl


【解决方案1】:

在 unix 系统中,shell 扩展 glob 并将文件名传递给程序。

$ perl -e'CORE::say for @ARGV' *
file1
file2

另一方面,Windows shell 按原样传递值,并留给程序根据需要将它们视为 glob。

>perl -e"CORE::say for @ARGV" *
*

您可以按如下方式执行通配:

>perl -MFile::DosGlob=glob -e"BEGIN { @ARGV = map glob, @ARGV } CORE::say for @ARGV" *
file1
file2

BEGIN 块通常不需要,但它可以确保在使用-n-p 隐含)时足够早地进行全球定位。

-MFile::DosGlob=glob 使 glob 具有类似 Windows 的语义。例如,它会导致*.* 匹配所有文件,即使它们不包含.

综合:

perl -i -MFile::DosGlob=glob -pe"BEGIN { @ARGV = map glob, @ARGV } s,vaadin-element,color-picker,g" *.* demo/* test/* src/* theme/*/*

【讨论】:

  • 感谢 sn-p 的完整解释和解决方案!
【解决方案2】:

在 Unix 派生的操作系统中,shell 扩展像 *.* 这样的 glob,并将命令行作为字符串数组提供给程序。

在 Windows 中,命令行是单个字符串,由程序来解释它的含义,包括引号字符和 glob 等内容。如果程序是普通的 C 程序,C 运行时会解释命令行,扩展 glob,并将字符串数组传递给 main。这是因为 C 标准要求这样做。

但是 Perl 不是 C。使用 File::Glob 库来扩展参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-25
    • 2019-05-05
    • 1970-01-01
    • 2011-12-14
    • 2012-05-27
    • 2014-11-20
    • 2017-01-05
    • 2017-01-03
    相关资源
    最近更新 更多