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 )
”
谢谢
答案 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;