正则表达式 – 了解这个perl解决方案
我正在尝试解决代码高尔夫练习,其中包括输入测试用例的数量,然后在每个测试用例的每一行中输入一个整数.
在我寻求最短的解决方案的过程中,我遇到了this解决方案: #!perl -lp use bigint;$_=???<>+1:bnok{2*$_}$_ 我是非常新的perl,因此我没有得到这段代码实际上是如何工作的.如果有人帮我解决这个问题,我将不胜感激. PS:Asked and closed at codegolf.stackexhange. 解决方法
有一些工具可以找出Perl高尔夫球.一个是
perlsecret,记录了许多Perl高尔夫球手使用的“秘密运算符”和技巧.
对于这个特定的代码,理解什么是 最后,打开Perl高尔夫球包的终极工具是B::Deparse.这转换了Perl如何将代码理解为带有缩进等的人类可读Perl. -p选项使B :: Deparse添加括号,即使它们不是必需的,这有助于阐明优先级. -d选项可以更准确地表示对象.什么对象?观察. $perl -MO=Deparse,-p,-d #!perl -lp use bigint;$_=???<>+1:bnok{2*$_}$_ Use of ?PATTERN? without explicit operator is deprecated at - line 2. BEGIN { $/ = "n"; $ = "n"; } use bigint; LINE: while (defined(($_ = <ARGV>))) { chomp($_); BEGIN { $^H{'bigint'} = '1'; $^H{'binary'} = 'CODE(0x7fc88ba3d580)'; $^H{'float'} = 'CODE(0x7fc88ba3d478)'; $^H{'integer'} = 'CODE(0x7fc88b298428)'; } ($_ = (?? ? (<ARGV> + bless( {"sign" => "+","value" => [1]},'Math::BigInt' )) : (bnok { (bless( {"sign" => "+","value" => [2]},'Math::BigInt' ) * $_) } $_))); } continue { (print($_) or die("-p destination: $!n")); } - syntax OK 这揭示了一些更深奥的东西…… > ???是 通过一些缩进和垂直空白,可以更容易地理解程序的内容.一个具有良好匹配的编辑器就是您需要完成的工作. ( $_ = (?? ? (<ARGV> + bless( {"sign" => "+",'Math::BigInt' )) : (bnok {(bless( {"sign" => "+",'Math::BigInt' ) * $_) } $_) ) ); >因为??对于整个程序只会匹配一次,它用于跳过第一行,即测试次数. 有一个细节我还没有解决.为什么<> 1而不是<>?它似乎压制了一个空白行,但我不知道为什么. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |