在我们的代码库中,我们经常使用这个结构来处理我们程序的选项:
Readonly my $ARGS => Getopt::Declare->new(
join( "\n",
'[strict]',
"--option1 <some-option-description> [required]",
)
) or exit(1);
问题是,当违反严格性Getopt::Declare->new(...)
时,它会返回undef
,这通常是可以的,只是它undef
存储在Readonly变量中,当在布尔上下文中评估时为true。
一个明显的解决方案是删除
Readonly
并且代码将按预期运行;但是我真的不喜欢这个解决方案,因为改变它会允许$ARGS
被修改。my $ARGS => Getopt::Declare->new( join( "\n", '[strict]', "--option1 <some-option-description> [required]", ) ) or exit(1);
另一种解决方案是将 in parens 包装起来,以便在分配给Readonly变量
Getopt::Declare->new(...) or exit(1)
之前对它们进行评估。Readonly my $ARGS => ( Getopt::Declare->new( join( "\n", '[strict]', "--option1 <some-option-description> [required]", ) ) or exit(1); )
我想另一种方法是使用 or 的更高优先级版本
||
,它的绑定比强,=>
但我不确定它是否可读。Readonly my $ARGS => Getopt::Declare->new( join( "\n", '[strict]', "--option1 <some-option-description> [required]", ) ) || exit(1);