0

Hye,你能检查我的脚本哪里是我的问题..对不起,我是 perl 的新手..我想从数字转换为英文单词,例如 1400 -> 1400 ......我已经用过

Lingua::EN::Numbers qw(num2en num2en_ordinal);

这是我的输入文件.txt

I have us dollar 1200 

并且输出应该是。“我有我们一千二百美元”

这是我的脚本

#!/usr/bin/perl

use utf8;
use Lingua::EN::Numbers qw(num2en num2en_ordinal);

if(! open(INPUT, '< snuker.txt'))
{
die "cannot opent input file: $!";
}

select OUTPUT;

while($lines = <INPUT>){

$lines =~ s/usd|USD|Usd|uSd|UsD/us dollar/g;
$lines =~ s/\$/dollar /g;
$lines =~ s/rm|RM|Rm|rM/ringgit malaysia /g;
$lines =~ s/\n/ /g; 
$lines =~ s/[[:punct:]]//g;
$lines =~ s/(\d+)/num2en($lines)/g; #this is where it should convert to english words
    print lc($lines); #print lower case
}

close INPUT;
close OUTPUT;
close STDOUT;

我得到的输出是“ i have us dollar num2en(i have us dollar 1200 )

谢谢你

4

3 回答 3

7

$1您需要使用而不是在最后一个正则表达式中传递来引用捕获,在该正则表达式的末尾$lines还需要一个e标志,以便将其作为表达式进行评估。您可以使用iflag 来避免写入 [Uu][Ss][Dd]... 的所有组合:

while($lines = <INPUT>){
  $lines =~ s/usd/us dollar/ig;
  $lines =~ s/\$/dollar /g;
  $lines =~ s/rm/ringgit malaysia /ig;
  $lines =~ s/\n/ /g; 
  $lines =~ s/[[:punct:]]//g;
  $lines =~ s/(\d+)/num2en($1)/ge; #this is where it should convert to english words
  print lc($lines), "\n"; #print lower case
}
于 2013-03-26T08:07:03.607 回答
5

您缺少e正则表达式替换的修饰符:

$ echo foo 42 | perl -pe "s/(\d+)/\$1+1/g"
foo 42+1
$ echo foo 42 | perl -pe "s/(\d+)/\$1+1/ge"
foo 43

man perlop

选项与 m// 一样,但添加了以下替换特定选项:
        将右侧计算为表达式。

另外,您必须参考捕获的数字 ( $1),而不是整个字符串 ( $lines),但我想您已经掌握了这一点。

于 2013-03-26T08:03:10.223 回答
0

这里的问题是您将正则表达式与函数混淆了。在您尝试进行转换的行中,您没有调用函数num2en;相反,您将数字替换为 text num2en($line)。这里给你一个建议:

($text, $number) = $lines =~ s/(.*)+(\d+); # split the line into a text part and a number part
print lc($text . num2en($number));         # print first the text, then the converted number;
于 2013-03-26T08:02:54.193 回答