字符串替换结果与从系统命令调用与命令行调用不同

问题描述 投票:0回答:1

我们有一个文件需要将 ASCII 字符转换为另一个 ASCII 字符以进行格式化。我们始终使用 perl -pesed 在 Perl 脚本内的系统命令中从外部调用来执行此操作。

但是,自从我们从 AIX 迁移到 Red Hat 以来,我们注意到 perl -pe 在 perl 脚本中无法按预期工作,而在命令行中则可以。

system("cat $AlifeFile | perl -p -e 's/\|.*MSH/\nMSH\|/g'| tr -d '\v'>> <outbound file name>");

产品

MSH|
MSH|
MSH||
MSH|^
MSH|~
MSH|\
MSH|&
MSH||
MSH|A
MSH|-
MSH|L
MSH|i
MSH|f
MSH|e
MSH||
MSH||
MSH|I
MSH|D
MSH|X
MSH|_
MSH|T
MSH|E
MSH|S
MSH|_
MSH|C
MSH|H
MSH|G
MSH||
MSH||
MSH|2
MSH|0
MSH|2
MSH|4
MSH|0
MSH|5
MSH|0
MSH|9
MSH|1
MSH|3

如果应该

MSH...
MSH...

当我尝试更换时 034 与一个 HL7 消息中 MSH 段之前。

当我尝试相同的系统命令,但从 perl 脚本之外的命令行时,它会正确翻译它。

那么,为什么如果我从系统命令内的 perl 脚本调用它,它会产生与我从 Red Hat 命令行调用相同代码时不同的结果?

perl command-line rhel8
1个回答
1
投票

Perl 字符串文字

"… perl -p -e 's/\|.*MSH/\nMSH\|/g' …"

产生字符串

… perl -p -e 's/|.*MSH/␊MSH|/g' …

同样,

"… tr -d '\v' …"

产生字符串

"… tr -d 'v' …"

这些不是您要执行的程序。


请注意,后者会产生警告。始终使用

use strict; use warnings;
或同等内容。

© www.soinside.com 2019 - 2024. All rights reserved.