【问题标题】:How does use of "my" keyword distiguish the results in perl?在 perl 中使用“my”关键字如何区分结果?
【发布时间】:2014-08-14 07:50:58
【问题描述】:

我不明白“我的”关键字在这里是如何工作的。这是我的 perl 脚本。

$line = ' sdfaad(asdvfr)';

代码1:

if ($tmp = $line =~ /(\(\s*[^)]+\))/ ) {
    print $tmp;
}

输出:

1

代码2:

if (my ($tmp) = $line =~ /(\(\s*[^)]+\))/ ) {
    print $tmp;
}

输出:

(asdvfr)

为什么两个输出不同?和my的使用有关系吗?

【问题讨论】:

  • 请注意printf $tmp; 没有意义。你想要printf "%s", $tmp;print $tmp;
  • 是的!刚刚在网上查了下区别。谢谢。但是两者的最终结果是一样的吗?我找不到 printf 和 print 后跟一个参数之间的任何区别。
  • 某些字符在格式字符串中是特殊的(printf 的第一个参数)。您已经在没有意识到的情况下看到了差异。试试my $tmp = '%s';
  • 有所不同。感谢澄清

标签: perl scripting pattern-matching output string-matching


【解决方案1】:

造成差异的不是my,而是标量/列表上下文。 $tmp 周围的大括号正在强加列表上下文,

if (($tmp) = $line=~ /(\(\s*[^)]+\))/ ) # braces makes difference, not 'my'

my 仅将变量声明为词法范围的变量。

【讨论】:

  • 你能解释一下吗
【解决方案2】:

Perl 有两种不同的赋值运算符;一个列表赋值运算符和一个标量赋值运算符。列表赋值给出其右操作数列表上下文,而标量赋值给出其右操作数标量上下文。匹配操作根据上下文返回不同的结果。

哪个运算符= 取决于左侧的内容;如果是数组、散列、切片或带括号的表达式,则为列表赋值;否则它是一个标量赋值。

【讨论】:

    猜你喜欢
    • 2014-01-20
    • 2018-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-26
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多