2015-06-03 32 views
1

我正在嘗試製作一個腳本,它將帶有帶重音符號的字符串並返回它們的不重疊對象。正則表達式<STDIN>找不到匹配項 - Perl

在設法找到一些幫助和教程後,我設法做出了幾乎可行的工作,但是我遇到了問題。

我的代碼做我想做的事情,只要我希望它在一個簡單的字符串上完成,但是當我想要使用<STDIN>時它什麼也不做。

我的代碼:

use strict; 
use warnings; 


my %replace = (
    'é' => "e", 
    'á' => "a", 
    'ő' => "o", 
    'ö' => "o", 
    'ó' => "o", 
    'ú' => "u", 
    'ü' => "u", 
    'ű' => "u", 
    'í' => "i",  
); 

my $regex = join "|", keys %replace; 
$regex = qr/$regex/; 

my $s = <STDIN>; 
$s = substr $s, 0, length($s) - 1; 

my $var = "$s - öüóőúéáű"; 

$var =~ s/($regex)/$replace{$1}/g; 

$s = $var; 

print "$s\n"; 

如果我輸入 「öüóőúéáű」 以<STDIN>我得到下面的輸出:

öüóőúéáű - ouooueau

有人能告訴我什麼,我做錯了什麼?

編輯:

我檢查,使用時像以下(含<DATA>而不是<STDIN>)它正常工作:

use strict; 
use warnings; 

my %replace = (
    'é' => "e", 
    'á' => "a", 
    'ő' => "o", 
    'ö' => "o", 
    'ó' => "o", 
    'ú' => "u", 
    'ü' => "u", 
    'ű' => "u", 
    'í' => "i",  
); 

my $regex = join "|", keys %replace; 
$regex = qr/$regex/; 

my $s = <DATA>; 
$s = substr $s, 0, length($s) - 1; 

my $var = "$s - öüóőúéáű"; 

$var =~ s/($regex)/$replace{$1}/g; 

$s = $var; 

print "$s\n"; 

__DATA__ 
öüóőúéáű 

EDIT2:

我現在做了以下內容: my $s = <DATA>." - ".<>;,所以它從<DATA>以及<STDIN>中讀取字符,現在我意識到,它仍然與<DATA>匹配,並確實同時注意到<STDIN>,所以我得到的輸出如下:

uaeuoouoi - űáéúőóüöí - uaeuoouoi從下面的代碼:

use strict; 
use warnings; 
use utf8; 

my %replace = (
    'é' => "e", 
    'á' => "a", 
    'ő' => "o", 
    'ö' => "o", 
    'ó' => "o", 
    'ú' => "u", 
    'ü' => "u", 
    'ű' => "u", 
    'í' => "i",  
); 

my $regex = join "|", keys %replace; 
$regex = qr/$regex/; 



my $s = <DATA>." - ".<>; 
$s = substr $s, 0, length($s) - 1; 

my $var = "$s - űáéúőóüöí"; 

$var =~ s/($regex)/$replace{$1}/g; 

$s = $var; 

print "$s\n"; 

__DATA__ 
űáéúőóüöí 

其中<STDIN> =űáéúőóüöí

+0

'使用開放QW(:STD:UTF8);' –

+0

@Сухой27我補充說,我的腳本的頂部,現在加時重音字符我得到以下內容:'utf8「\ xA0」不映射到Unicode在regex.pl行20,行1.格式錯誤的UTF-8字符(意外的字符串結尾)在regex.pl行22, 第1行。' – WolfyD

+0

您使用的是Windows嗎? –

回答

2

在我的情況跟你的程序中,我得到預期的結果:

use strict; 
use warnings; 


my %replace = (
    'é' => "e", 
    'á' => "a", 
    'ő' => "o", 
    'ö' => "o", 
    'ó' => "o", 
    'ú' => "u", 
    'ü' => "u", 
    'ű' => "u", 
    'í' => "i",  
); 

my $regex = join "|", keys %replace; 
$regex = qr/$regex/; 

my $s = <DATA>; 
$s = substr $s, 0, length($s) - 1; 

my $var = "$s - öüóőúéáű"; 

$var =~ s/($regex)/$replace{$1}/g; 

$s = $var; 

print "$s\n"; 

__DATA__ 
öüóőúéáű 

我在哪裏:

$ perl test.pl 
ouooueau - ouooueau 

所以你有另一個問題,如編碼問題。

您可以嘗試添加到您的程序中。

use utf8; 

你也可以簡化你的程序是這樣的:

use strict; 
use warnings; 

my %replace = (
    'é' => "e", 
    'á' => "a", 
    'ő' => "o", 
    'ö' => "o", 
    'ó' => "o", 
    'ú' => "u", 
    'ü' => "u", 
    'ű' => "u", 
    'í' => "i",  
); 

while(<DATA>) { 
    for my $key (keys %replace) { 
     s/$key/$replace{$key}/; 
    } 
    print; 
} 

__DATA__ 
öüóőúéáű 
+0

嗯......嗯,我想這可能是一個問題與PC(我在公司的PC)謝謝,雖然! – WolfyD

+0

其實,我檢查了你的回覆,並試着用''這樣的方式對我來說也是如此,所以我想肯定有不同的東西'' – WolfyD

+0

@WolfyD你能提供'echo $ TERM'和'echo $ LANG'? – nowox