使用Perl的CSV文件的部分文件名

时间:2013-11-21 12:14:51

标签: perl csv filenames

拥有以下输入文件:Green_*.csvRed_*.csvBlue_*.csvYellow_*.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文件中。 任何帮助非常感谢。

3 个答案:

答案 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