拥有以下输入文件:Green_*.csv
,Red_*.csv
,Blue_*.csv
,Yellow_*.csv
如何提取颜色名称。我正在尝试以下代码:
sub putInColumn {
my $filename = getFilename(@_);
my @name = split '_', $filename;
if ( $name[0] eq 'Green' ) { return 'Green'; }
if ( $name[0] eq 'Red' ) { return 'Red'; }
if ( $name[0] eq 'Blue' ) { return 'Blue'; }
if ( $name[0] eq 'Yellow' ) { return 'Yellow';}
return 'error';
}
...但我收到错误。我想要实现的是将颜色名称放在此csv文件中。 任何帮助非常感谢。
答案 0 :(得分:0)
你可以用这个:
my ($color) = ($filename =~ m/^(\w+)_.*\.csv/i);
注意$ color周围的括号 - 我使用= ~regex运算符的LIST上下文将正则表达式中的组返回到变量列表中。因此(\w+)
将被复制到$ color。
这大致转换为:
my $color = undef;
if ( $filename =~ m/^([^_]+)_.*\.csv/i ) {
$color = $1;
}
答案 1 :(得分:0)
您可以尝试这样的事情:
our @arrColors = ('red', 'green', 'etc');
sub putInColumn {
my $filename = shift;
$filename =~ /^([^_]+)/;
my $color = $1;
return $color if(grep(/$color/i, @arrColors));
return 'error';
}
答案 2 :(得分:0)
你应该考虑一些更有活力的东西。如果您匹配的是颜色,那么为什么不只匹配颜色?
my @cols = qw(green red blue yellow);
my $rx = join "|", @cols;
$rx = qr#\b($rx)\b#;
...
sub check_col {
return $_[0] =~ /$rx/ig;
}
请注意,在颜色名称周围使用\b
将避免部分匹配。
还要注意使用不区分大小写的修饰符/i
和/g
,在这种情况下将返回匹配的所有字符串。像这样的解决方案将使您在使用返回值时具有一定的灵活性
if (check_col($foo)) # false means no colour found
$found = check_col($foo); # same thing
$count = () = check_col($foo); # returns number of colours found
@cols = check_col($foo); # a list of all colours names found
my ($col) = check_col($foo); # take first colour found