【问题标题】:Perl shell command cannot match @ symbolPerl shell 命令不能匹配@符号
【发布时间】:2020-04-20 00:45:30
【问题描述】:

我正在尝试使用 perl 编写一个 shell 命令来对字符串进行非常基本的检查,以查看它是否看起来像电子邮件地址。下面的最小可重现示例:

# perl --version v5.28.1
perl -E 'exit 1 if "you@example.com" !~ /@/' || echo 'failed'

以上输出failed。我知道@ 符号用于表示 perl 中的数组,但在搜索后显然它不需要转义。即使我用反斜杠转义它,结果也是一样的。

那么问题是,为什么 sh 运行 perl 正则表达式不匹配 @ 符号?还是我还缺少其他东西?

【问题讨论】:

  • 试试perl -wE 'print "you@example.com\n";'
  • @Mat Ahhh... 非常感谢。如果您将详细信息添加到答案中,我很乐意接受。这给了我我需要的一切。有时您只需要轻轻一推。

标签: regex shell perl sh


【解决方案1】:

当固特异在corner shop 中可用时,为什么要使用马车车轮?

use Email::Valid;
my $address = Email::Valid->address('you@example.com');
exit $address ? 1 : 0;

不过,您最初的问题是引用问题。但你知道,到目前为止,我从 cmets 估计。

【讨论】:

  • 恐怕这是在可配置的 git 挂钩中使用,人们将能够指定他们想要验证作者电子邮件的正则表达式。我只需要基本的正则表达式来获得合理的默认值。但你是对的,通常比自己滚动要好。
【解决方案2】:

在问题下方的 cmets 中运行 @Mat 建议的命令后,这里的问题很明显。

$ perl -wE 'print "you@example.com\n";'
Possible unintended interpolation of @example in string at -e line 1.
Name "main::example" used only once: possible typo at -e line 1.
you.com

被匹配的字符串使用了双引号,导致它被插值。插值将@example 转换为数组引用,但由于未定义而将其剥离。

因此,原始问题中的正则表达式无法匹配电子邮件,因为它的一部分在字符串插值期间被剥离。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 2013-04-16
    相关资源
    最近更新 更多