【问题标题】:Equating string variables in Perl?在 Perl 中相等的字符串变量?
【发布时间】:2013-05-08 13:55:58
【问题描述】:

我创建了一个 Perl 脚本来从相对路径中提取文件名。 这是一个 sub,它将路径作为参数,然后从中计算名称,然后将其附加到全局变量中。

my $all_names = "";
sub check_line
{
    my @args = @_;
    my $line = $args[0]; #take the path
    my @paths = split(/\\|\//, $line); #split according to folder
    my $last = @paths;
    $last = $last - 1;
    my $name = $paths[$last]; #take the file name
    chomp($name); #remove \n character from end of string
    my ($ext) = $name =~ /(\..+)/; #extract the file extension from file name
    if(($ext eq ".h") || ($ext eq ".cpp") || ($ext eq ".c")) #filter the required files
    {
         $all_names = $all_names . "$name "; #append the file names to global variable
    }
}

现在这个脚本在 Perl 5.005 中运行良好(是的,我们也有那个旧版本的 Perl!)。 但是如果我在 Perl 5.10 上运行它,它将无法正常运行。 检查文件扩展名总是返回 false。 即使当我打印文件扩展名时,我也能以.h.c 正确获取它,但即使我单独比较它

if($ext eq ".c")

然后它返回 false。 这里可能有什么问题? 谢谢。

【问题讨论】:

  • 如果您打印length($ext),是否为.c 打印2?
  • @Andomar 不,它的打印 3. 为什么会这样?不应该 chomp 删除所有这些\n。 \r 字符?

标签: perl


【解决方案1】:

这不是因为版本更改。

您可能有一个以 CR LF 结尾的文件,并且您在非 Windows 机器上运行。

您可以使用dos2unix 或类似名称修复行尾。

或者,你可以改变

chomp($name);

$name =~ s/\r?\n\z//;

或者更好

$name =~ s/\s+\z//;

【讨论】:

  • 问题出在 windows 7 上的 cygwin 上。使用旧版本的 Perl,即使在没有 dos2unix 的 Sun 上,该脚本也可以工作。
  • 不删除 \r 字符吗?
  • 你能解释一下 \z 和 \s 是什么吗?
  • @Cool_Coder,不,它会删除$/的内容,默认是一个LF。
  • \s 匹配空白字符。 \z 匹配字符串的结尾。 (很多人错误地使用了$,而他们的意思是\z。)
猜你喜欢
  • 1970-01-01
  • 2017-06-21
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多