将号码更改为英语Perl

时间:2013-03-26 07:55:33

标签: regex perl

Hye,你能看看我的剧本我的问题在哪里。我是新来的perl ..我想从数字换成英文单词,例如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 )

谢谢

3 个答案:

答案 0 :(得分:7)

您需要使用$1来引用捕获,而不是在最后一个正则表达式中传递$lines,您最后还需要一个e标记,以便将其评估为表达。您可以使用i标志来避免编写[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
}

答案 1 :(得分: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 //一样,添加了以下替换   具体选择:
  e评估右侧作为表达。

另外你必须引用捕获的数字($1),而不是整个字符串($lines),但我猜你已经抓住了它。

答案 2 :(得分:0)

这里的问题是你将regexp与函数混淆。在您尝试进行转换的行中,您没有调用函数num2en;相反,您将使用文本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;