【问题标题】:Perl: Can not compare two strings if one of them is with special charsPerl:如果其中一个带有特殊字符,则无法比较两个字符串
【发布时间】:2017-04-28 09:55:35
【问题描述】:

我是 Perl 新手。

我正在尝试检查现有变量 $file_path 是否等于 if 条件下的特定路径。

my $PRODPATH = '/path/to/prod';

if ( $file_path eq "$PRODPATH/specific/path/to/file" ) {
    print "File is same as earlier \n\n";
}
else {
    print "File is not same as earlier \n\n";
}

但由于字符串中的特殊字符$$file_path 进行比较,因此流程不会进入任何条件。

路径中的斜线 / 是否也会产生任何问题?

【问题讨论】:

  • 我不明白你的问题。 Perl 将插入变量,所以"$PRODPATH/specific/path/to/file" 变为"/path/to/prod/specific/path/to/file",这就是将与$file_path 进行比较的内容。斜线的数量/ 需要相同。也许$file_path 有一个斜杠,即以file/ 结尾?
  • 这感觉可能是 XY 问题。你想在这里完成什么?
  • "$PRODPATH 是一个环境变量" - 不,不是。这是一个 Perl 变量。您是否使用严格和警告?
  • 请不要对您的问题进行完全改变问题的更改。您的最后一次编辑似乎表明您已按照我的建议尝试使用$ENV{PRODPATH},但您没有说要这样做,也没有完成我要求的其他诊断。在答案中添加 内容很好,但您永远不应该通过更改您的问题来使其他人的 cmets 或答案无效。如果您对收到的建议有后续问题,那么您应该提出一个新问题。

标签: string perl if-statement special-characters filepath


【解决方案1】:

由于字符串中的特殊字符 $,流程不会进入任何条件

这是一个错误的诊断,我不明白你是怎么想到的。像 $PRODPATH 这样的 Perl 变量在双引号字符串中展开,但是如果您将 Perl 变量 $PRODPATH 设置为与环境变量相同的值,那么您的代码应该可以工作

你可以通过Perl的%ENV哈希访问环境变量,所以你应该去掉$PRODPATH的定义并写

if ( $file_path eq "$ENV{PRODPATH}/specific/path/to/file" ) { ... }

此外,您必须始终use strictuse warnings 'all' 放在您编写的每个 Perl 程序的顶部。

如果您仍然有问题,请将其添加到您的代码中并显示结果

use Data::Dumper;
print Dumper [ $file_path, $ENV{PRODPATH} ];

【讨论】:

  • 添加 local $Data::Dumper::Useqq = 1; 在这些情况下会有所帮助。
【解决方案2】:

在双引号中,变量被插值(扩展)。

所以这行得通:

#!/usr/bin/env perl
use strict;
use warnings;

my $file_path = '/path/to/prod/specific/path/to/file';
my $PRODPATH = '/path/to/prod';
if ( $file_path eq "$PRODPATH/specific/path/to/file" )
{
  print "File is same as earlier \n\n";
}
else
{
  print "File is not same as earlier \n\n";
}

如果$file_path 不是字面上 相同的文本字符串,那么它不会。特别是 - 如果路径包含额外(或尾随)斜杠,或者它是相对路径,或者它是符号链接 - 比较将不起作用。

【讨论】:

    猜你喜欢
    • 2021-04-29
    • 2019-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 2012-03-23
    • 2014-05-31
    • 2014-01-31
    相关资源
    最近更新 更多