范围算子; 翻转,但防止翻牌,并立即翻转

Сух*_*й27 6 perl

perl -wle 'print join " ", grep /3/ .. undef(), 1..10'
Run Code Online (Sandbox Code Playgroud)

输出 3 4 5 6 7 8 9 10

Q1:有没有比undef防止翻牌更好的方法?

Q2:如何强制范围运算符的左侧部分无条件true(即.true .. /7/)?

更新:

perl -wE 'say join " ", grep { ((/7/ .. undef)||1) ==1 } 1..10'
Run Code Online (Sandbox Code Playgroud)

可以用作true .. /7/替代品.

ike*_*ami 5

  1. 任何非常数折叠为数字的虚假表达都可以.

    perl -wE'say join " ", grep $_==3 .. undef, 1..10'
    
    perl -wE'say join " ", grep $_==3 .. do{0}, 1..10'
    
    perl -wE'say our $FALSE; say join " ", grep $_==3 .. $FALSE, 1..10'
    
    Run Code Online (Sandbox Code Playgroud)

    没有触发器.

    perl -wE'my $ok; say join " ", grep $ok ||= $_==3, 1..10'
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果你想要布尔值相反的东西,使用否定!

    perl -wE'say join " ", grep !($_==8 .. undef), 1..10'
    
    Run Code Online (Sandbox Code Playgroud)

    没有触发器.

    perl -wE'my $done; say join " ", grep !($done ||= $_==8), 1..10'
    
    Run Code Online (Sandbox Code Playgroud)

    好的,所以我换78.要实际匹配7,

    perl -wE'my $last; say join " ", grep { my $x = ($_==7 .. undef); !$x || $x == 1 } 1..10'
    
    Run Code Online (Sandbox Code Playgroud)

    没有触发器.

    perl -wE'my $done; say join " ", grep { my $rv = $done; $done ||= $_==7; !$rv } 1..10'
    
    Run Code Online (Sandbox Code Playgroud)