0

ねえ、私のスクリプトをチェックしてくれませんか。私の問題はどこにありますか。申し訳ありませんが、Perlは初めてです。たとえば、1400->1400などの数字から英語の単語に変換したいです...すでに使用しています

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

これは私の入力file.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を渡す代わりに、を使用してキャプチャを参照する必要があります。フラグを使用して、[Uu] [Ss] [Dd]...のすべての組み合わせを書き込まないようにすることができます。$linesei

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//と同じですが、次の置換固有のオプションが追加されています
        。e式として右側を評価します。

$1さらに、文字列全体()ではなく、キャプチャされた番号()を参照する必要があり$linesますが、すでにそれをキャッチしていると思います。

于 2013-03-26T08:03:10.223 に答える
0

ここでの問題は、正規表現と関数を混同していることです。変換を行おうとしている行では、関数を呼び出していません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;
于 2013-03-26T08:02:54.193 に答える