--$| 怎么样?在 Perl 中工作?

发布于 2024-10-16 13:36:31 字数 113 浏览 3 评论 0原文

最近我遇到了这种方法来过滤列表中的每一个第二值​​:

perl -E 'say grep --$|, 1..10'
13579

它是如何工作的?

Recently I came across this way to filter out every second value of a list:

perl -E 'say grep --$|, 1..10'
13579

How does it work?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

荒路情人 2024-10-23 13:36:31

$| 是一个特殊的 Perl 变量,只能具有值 0 和 1。
任何对 true 非零值的 $| 的赋值,

$| = 1;
$| = 'foo';
$| = "4asdf";          # 0 + "4asdf" is 4
$| = \@a;

都会产生将 $| 设置为 1 的效果。 false 零值

$| = 0;
$| = "";
$| = undef;
$| = "erk";            # 0 + "erk" is 0

会将 $| 设置为 0。

--$| 展开为 $| = $| - 1,现在你可以看到发生了什么。
如果 $| 最初为 1,则 --$| 会将值更改为 0。
如果 $| 最初为 0,则 --$| 将尝试将该值设置为 -1,但实际上会将该值设置为 1。

$| is a special Perl variable that can only have the values 0 and 1.
Any assignment to $| of a true non-zero value, like

$| = 1;
$| = 'foo';
$| = "4asdf";          # 0 + "4asdf" is 4
$| = \@a;

will have the effect of setting $| to 1. Any assignment of a false zero value

$| = 0;
$| = "";
$| = undef;
$| = "erk";            # 0 + "erk" is 0

will set $| to 0.

Expand --$| to $| = $| - 1, and now you can see what is going on.
If $| was originally 1, then --$| will change the value to 0.
If $| was originally 0, then --$| will try to set the value to -1 but will actually set the value to 1.

债姬 2024-10-23 13:36:31

哈!当“预先递减”时,$| 在零值(在 Perl 中为 false)和一值(true)之间翻转——它只能保存这些值。

因此,您的 grep 标准在每次传递时都会发生变化,变为 true、false、true、false 等,从而返回列表中的所有其他元素。

太聪明了一半。

Ha! $| flips between the values of zero (false, in perl) and one (true) when "predecremented" -- it can only hold those values.

So, your grep criterion changes on each pass, going true, false, true, false, etc., and so returning every other element of the list.

Too clever by half.

我不咬妳我踢妳 2024-10-23 13:36:31

$| 只能是零或一。默认值为 0,因此通过在 grep -ing 第 0 个索引之前递减它,它将是 1。

随后的减量实际上会将其从零“切换”到一再到零,依此类推。

$| can only be zero or one. The default is 0, so by decrementing it before grep -ing the 0th index, it'll be one.

The subsequent decrements will actually "toggle" it from zero to one to zero and so forth.

二智少女猫性小仙女 2024-10-23 13:36:31

关键是这种使用只是一种令人讨厌的黑客行为。
$| (或其更具可读性的别名 $OUTPUT_AUTOFLUSH)是一个特殊变量,用于控制 STDOUT (或当前选定的文件句柄)的自动刷新。因此它只接受 true (1) 或 false (0)。

The point is this use is just a nasty hack.
$| ( or his more readable alias $OUTPUT_AUTOFLUSH) is a special variables to control the autoflush of STDOUT ( or the current selected filehandle). Therefore it only accepts true (1) or false (0).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文