首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl: Bareword找到操作符预期在

Perl: Bareword找到操作符预期在
EN

Stack Overflow用户
提问于 2018-12-05 08:19:29
回答 2查看 1.8K关注 0票数 1

我试图使用perl替换如下所示的字符串:

代码语言:javascript
复制
perl -pe "s/FlDigVal/$DIGN/" Header.xml > $DDIRP/$FNAME.xml

如果DIGN=+q4T/h/B8Saf0im3LtBevNvMPsd1PRG5Tz+Iq/uwjXA=出现以下语法错误:

代码语言:javascript
复制
Having no space between pattern and following word is deprecated at -e line 1.
Bareword found where operator expected at -e line 1, near "s/FlDigVal/+q4T/h"
Having no space between pattern and following word is deprecated at -e line 1.
syntax error at -e line 1, near "s/FlDigVal/+q4T/h"
Execution of -e aborted due to compilation errors.

我想这与/h处于变量DIGN有关。有什么办法可以避开那些保留的词吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-05 08:26:08

不要使用shell变量,这些变量只是不卫生的宏。将变量导出到Perl的环境中:

代码语言:javascript
复制
DIGN=$DIGN perl -pe 's/FlDigVal/$ENV{DIGN}/'

注意单引号:我们不希望shell更改Perl命令。

或将值作为参数传递:

代码语言:javascript
复制
perl -pe 'BEGIN { $replace = shift } s/FlDigVal/$replace/' "$DIGN" Header.xml

不过,您似乎在用正则表达式编辑XML文档。这是一种痛苦的方法,有些像XML::LibXML这样的库可以正确地处理XML。如果DIGN包含&<,会发生什么?

票数 4
EN

Stack Overflow用户

发布于 2018-12-05 08:25:30

问题不在于保留的单词,而在于/

如果DIGN包含+q4T/h/B8Saf0im3LtBevNvMPsd1PRG5Tz+Iq/uwjXA=,则命令将以下代码传递给+q4T/h/B8Saf0im3LtBevNvMPsd1PRG5Tz+Iq/uwjXA=

代码语言:javascript
复制
s/FlDigVal/+q4T/h/B8Saf0im3LtBevNvMPsd1PRG5Tz+Iq/uwjXA=/

这里,s/FlDigVal/+q4T/将解析为一个替换命令,但其余的都是垃圾。

解决方案是不要让shell将变量插入到代码中。相反,您可以通过环境传递字符串:

代码语言:javascript
复制
DIGN="$DIGN" perl -pe 's/FlDigVal/$ENV{DIGN}/' Header.xml

(如果DIGN已经导出,则不需要DIGN="$DIGN"部件。)

在这里,我们使用单引号(没有shell内插),让perl从环境中获取一个值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53627904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档