正则表达式替换

时间:2014-03-07 19:36:23

标签: regex perl

我正在尝试使用Perl中的map函数用字母C替换字符串数组的一部分,但我无法弄清楚这样做的正则表达式。 (我必须使用map,没有选项不使用它。)Perl为数组的每个部分返回1而不是正确的字符串,但使用C而不是数字。

基本上,我在Perl中有以下数组,我需要将数值更改为C。我需要使用map这样做,而且我不确定如何去做。我尝试@GradeC = map(s/7[2-9]/C/, @GradeC);,因为我的Google-fu表明可能是如何使用正则表达式查找/替换,但这不起作用。完全披露:这是作业,但我可以使用Stack Overflow寻求帮助。

@GradeC = ("Name: Shemp  Grade: 79",
           "Name: Curly  Grade: 75",  
           "Name: Larry  Grade: 72");


# map statement

print join("\n", @GradeC);

3 个答案:

答案 0 :(得分:3)

如果您想编辑现有结构,请使用for。

for (@GradeC) {
    s/7[2-9]/C/;
}

如果你真的想要一个新数组,那么不要忘记在替换后返回你的值。此外,正如ikegami指出的那样,你不想直接在$_上执行,因为它会编辑原始数组,所以改为使用临时变量。

my @newGrades = map { my $g = $_; $g =~ s/7[2-9]/C/; $g } @GradeC;

答案 1 :(得分:3)

  • 始终use strict;
  • 始终use warnings;
  • 当您使用use feature qw(say);时,您可以使用say声明。

Map获取数组中的元素,将每个元素设置为$_,然后对其运行命令。它还使用数组中的实际值别名 $_的每个瞬间,因此您无需执行任何操作。

我正在使用s/7\d/C/替换7的每个瞬间,后跟一个带字母C的数字。

#! /usr/bin/env perl
#
use warnings;
use strict;
use feature qw(say);

my @grade_c = (
    "Name: Shemp  Grade: 79",
    "Name: Curly  Grade: 75",  
    "Name: Larry  Grade: 72"
);


map { s/7\d/C/ } @grade_c;
say join "\n", @grade_c;

运行:

Name: Shemp  Grade: C
Name: Curly  Grade: C
Name: Larry  Grade: C

答案 2 :(得分:1)

“允许使用任何和所有可用资源”业务是荒谬的。

use strict;
use warnings;

my @grade_c = (
  'Name: Shemp  Grade: 79',
  'Name: Curly  Grade: 75',  
  'Name: Larry  Grade: 72',
);


print "$_\n" for map s/grade\s*:\s*\K\d+/C/r, @grade_c;

<强>输出

Name: Shemp  Grade: C
Name: Curly  Grade: C
Name: Larry  Grade: C

我相信你什么都没学到。