【发布时间】:2016-05-13 09:50:52
【问题描述】:
我需要检查第 300 个字符是否为{。如果是,则需要将其替换为 0。还要考虑到{ 之前的 10 位数字,制作一个负十进制数。示例:如果输入为111123456789{,则输出为11-112345678.90。
我的样本输入是:
H009704COV2009084 PHD0000001H009700204COV2009084 PROD2015122016010418371304COVH009704COV2009084 PTR0000001H0097002C00000000140000000043610000003408092A0000000068061C0000000000000{0000002939340H0000000537585H0000003476926F0000001218378G0000000040292E0000000016497{0000000000827E0000001880498{9000000320436J000000004391000000001606000000000030000000000128000000000006000000004227000000000000000000000000 00000140 0000000000000{0000000000773B0000000000000{000000000000
这里的第 300 个字符是{。因此,如果我将其替换为 0 并将其转换为负小数,则预期输出将是:
H009704COV2009084 PHD0000001H009700204COV2009084 PROD2015122016010418371304COVH009704COV2009084 PTR0000001H0097002C00000000140000000043610000003408092A0000000068061C0000000000000{0000002939340H0000000537585H0000003476926F0000001218378G0000000040292E0000000016497{0000000000827E000-000188049.809000000320436J000000004391000000001606000000000030000000000128000000000006000000004227000000000000000000000000 00000140 0000000000000{0000000000773B0000000000000{000000000000
我可以使用 sed 命令来做到这一点:
sed -e 's/\ (.\ {1,255\ }\ )\ (.\ {1,34\ }\ )\ (.\ {1,9\ }\ )\ ([^{]*\ ){/\1\2+\3.\40/'
但是当输入文件有大量记录(~80,000)时性能很差。如何将上述 sed 命令转换为 Perl 以获得相同的功能?
【问题讨论】:
-
您想从终端执行命令吗? “转换为负小数”是什么意思?你将
{替换为0,然后……让它做什么? -
由于我是 Perl 新手,我不确定是否可以使用一行命令来执行上述功能。每当在字符串中找到 { 时,它需要用 0 替换,考虑到 { 之前的 10 位数字,也会产生一个负十进制数。例如:如果输入为 111123456789{,则输出为 11-112345678.90
-
好的,知道了,但是 -- 上面示例中的逗号确实在 8 和 9 之间 (
8.90) 或者可能在 9 之后,89.0? -
抱歉,逗号不是输入的一部分。输入只是 111123456789{ 预期输出是 11-112345678.90
-
没关系,这就是我的意思,在输出中。所以它是距离
{更靠左的一个字符。所以1234{-->123.40(和左边十个位置)。我会在一分钟内发布,让我知道它的外观。
标签: perl