【发布时间】:2014-03-27 15:05:40
【问题描述】:
如果可能的话,我想让这个 2-Commands 更短,1 行。
my $id = shift;
my @splittedID = split(" ", $id);
return $splittedID[0];
但它最终应该具有相同的功能。谢谢
【问题讨论】:
如果可能的话,我想让这个 2-Commands 更短,1 行。
my $id = shift;
my @splittedID = split(" ", $id);
return $splittedID[0];
但它最终应该具有相同的功能。谢谢
【问题讨论】:
return (split " ", shift)[0];
或者,如果你愿意:
(split " ", shift)[0];
(sub 的最后一行的结果隐式成为返回值)。
甚至更短(/r 选项需要 Perl 5.16):
$_[0]=~s/ .*//r
当然,在实际的生产代码中,您的原始示例更好,因为它是可读的。
【讨论】:
@_ 如果它在子程序中,或者 @ARGV 如果不是。
因为您只希望split 和' ' 的第一项是跳过所有前导空格的特殊模式,所以正则表达式也可以像这样解决这个问题:
sub firstword {
return (shift =~ /(\S+)/)[0];
}
my $x = firstword('asdf qwer jkl') # Equals 'asdf';
my $y = firstword(' qwer jkl') # Equals 'qwer';
my $z = firstword(' ') # Equals undef;
此外,return 关键字当然是可选的,但较短并不总是更好。
【讨论】:
' ' 是一个特例。它会跳过所有前面的空格。
使用正则表达式会更紧凑:
sub first_field {
return unless $_[0] =~ /(\S+)/;
$1;
}
【讨论】:
sub ff {$_[0] =~ /(\S+)/;$1;} "test" =~ /(\w+)/; $x = ff('asdf qwer'); $z = ff(' ');。但是,我忘记了捕获变量已本地化到它们的块中,所以 $z 等于 'test' 而不是 'asdf'。