【问题标题】:Is there a string in Perl that is equal to all other strings under eq?Perl 中是否有一个字符串等于 eq 下的所有其他字符串?
【发布时间】:2013-07-10 13:22:26
【问题描述】:

我正在运行这样的字符串相等性检查:

if($myString eq "ExampleString")

myString 是否有一个值会导致执行进入if 结构,无论字符串文字是什么?

【问题讨论】:

  • 这不会破坏eq 的目的吗?您想要这样的值,还是要避免这样的值?
  • 您能解释一下您要达到的目标吗?您的问题是所谓的 X-Y 问题的一个示例:您问的是“我如何在技术上实现问题 Y 的解决方案 X”而不是问“Perl 中解决问题 Y 的最佳方法是什么”,因为 X 显然听起来像任何问题的错误解决方案:)
  • amon 的回答适合我想要实现的目标。不过感谢您的帮助!
  • @zztops - amon 的答案在技术上很棒,但在更大的方案中似乎是个坏主意(例如,我强烈建议如果你在生产代码中使用类似的东西,你有一些错误在您的设计中)。这就是为什么我问你真正想解决什么问题。
  • 绝对不是生产代码...只是搞砸

标签: string perl equality truthiness


【解决方案1】:

是的,使用对象和重载运算符:

package AlwaysTrue {
  use overload 'eq' => sub { 1 },
               '""' => sub { ${+shift} };
  sub new {
    my ($class, $val) = @_;
    bless \$val => $class;
  }
}

my $foo = AlwaysTrue->new("foo");

say "foo is =$foo=";
say "foo eq bar" if $foo eq "bar";

输出:

foo is =foo=
foo eq bar

但是,"$foo" eq "bar" 是 false,因为它会比较底层字符串。

【讨论】:

  • 我在 +100 和 -100 之间左右为难:“你会想这样做吗????这会导致代码难以维护!”
  • @DVK 是的,我自己只是盯着这篇文章,想着“我做了什么?”。值得注意的是,这种重载违反了 eq 运算符的隐含合同,例如它应该是传递的:如果$a eq $b$b eq $c 然后$a eq $c,这不适用于$b->isa("AlwaysTrue")
  • +1 或 -1 ? -1 表示可怕的代码。 +1 回答问题。 +1 教我一些东西。
【解决方案2】:

如果您的意思是“除 undef 之外的任何字符串”,则只需检查

if (defined $myString)

如果您的意思是“除 undef 或空字符串以外的任何字符串”,则只需检查

if ($myString) # Has a slight bug - will NOT enter if the number 0 passed
#or
if ($myString || $myString == 0)  # Avoids the above bug

如果你的意思是 ANY ANY 字符串,你不需要 if.... 但如果你还是想要一个:

if (1)

如果您的意思是“任何看起来不像数字的字符串”(例如,区分“11”和“11a”):

use Scalar::Util qw(looks_like_number);
if (Scalar::Util::looks_like_number($myString))

【讨论】:

  • 有没有办法将字符串初始化为undef?
  • @zztops - my $string = "a"; undef $string; - 但严格来说,它不再是“字符串”了。 Perl 没有“字符串类型”,只是一个包含字符串、整数和浮动组件的标量,只是一个变量,您的代码将把它视为字符串
  • @DVK:简单地保留变量未定义:my $string
  • @chepner - 是的,最终结果是相同的,但现在没有任何语义表明它是一个“字符串”(例如,它包含一个字符串值)。我的例子是说明性的,而不是“最好的技术”
  • 它是否曾经包含一个字符串值?未定义是未定义的;没有“未定义的字符串”或“未定义的整数”之类的东西。
猜你喜欢
  • 2019-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-27
  • 1970-01-01
  • 2018-01-05
  • 2013-06-06
相关资源
最近更新 更多