【问题标题】:Regex on <STDIN> not finding matches - Perl<STDIN> 上的正则表达式找不到匹配项 - Perl
【发布时间】:2015-06-03 09:36:55
【问题描述】:

我正在尝试制作一个脚本,该脚本将接收带有重音字符的字符串,并返回它们的非重音字符。

在四处寻找帮助和教程后,我设法做出了几乎可以工作的东西,但是我遇到了问题。

我的代码做我想做的事,只要我希望它在一个简单的字符串上完成,但是当我想使用 &lt;STDIN&gt; 时它绝对什么都不做。

我的代码:

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";

如果我输入“öüóőúéáű”到&lt;STDIN&gt;,我会得到以下输出:

öüóőúéáű - ouooueau

谁能告诉我我做错了什么?

编辑:

我检查过,当像下面这样使用它时(使用&lt;DATA&gt; 而不是&lt;STDIN&gt;)它可以正常工作:

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__
öüóőúéáű

编辑2:

我现在做了以下事情:my $s = &lt;DATA&gt;." - ".&lt;&gt;; 所以它从&lt;DATA&gt;&lt;STDIN&gt; 中读取字符,现在我意识到它仍然与&lt;DATA&gt; 匹配并且没有注意到&lt;STDIN&gt;,所以我得到以下输出:

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__
űáéúőóüöí

&lt;STDIN&gt; = űáéúőóüöí

【问题讨论】:

  • use open qw(:std :utf8);
  • @Сухой27 我将它添加到脚本的顶部,现在添加重音字符时,我得到以下信息:utf8 "\xA0" does not map to Unicode at regex.pl line 20, &lt;STDIN&gt; line 1. Malformed UTF-8 character (unexpected end of string) in length at regex.pl line 22, &lt;STDIN&gt; line 1.
  • 你在用windows吗?
  • @Сухой27 是的,Windows 8 Pro x64

标签: regex windows perl utf-8 stdin


【解决方案1】:

在你的程序中,我得到了预期的结果:

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__
öüóőúéáű

【讨论】:

  • 嗯...好吧,我想这可能是个人电脑的问题(我在公司的个人电脑上)谢谢!
  • 实际上,我检查了您的回复,并使用&lt;DATA&gt; 进行了尝试,这样它也适用于我,所以我想&lt;STDIN&gt; 一定有什么不同
  • @WolfyD 你能提供echo $TERMecho $LANG 的值吗?
  • 我不熟悉这些,我应该在哪里找到这些值? Perl 还是其他地方?
  • 嗯,这意味着您的终端不是 UTF-8。 Windows 控制台有不同的编码,如果您的 Perl 脚本是用 utf-8 编写的,它将无法工作。在cmd.exe 上尝试chcp。也许这可以帮助你:question
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-24
  • 2017-10-11
相关资源
最近更新 更多