我想让这个2命令更短,如果可能的话就行1行。
my $id = shift;
my @splittedID = split(" ", $id);
return $splittedID[0];
但它应该具有相同的功能。感谢
答案 0 :(得分:6)
return (split " ", shift)[0];
或者,如果你想:
(split " ", shift)[0];
(sub的最后一行的结果隐式变为返回值)。
更短(/r
选项需要Perl 5.16):
$_[0]=~s/ .*//r
当然,在实际的生产代码中,您的原始示例更好,因为它是可读的。
答案 1 :(得分:1)
因为您只想要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
关键字当然是可选的,但更短并不总是更好。
答案 2 :(得分:0)
使用正则表达式更加紧凑:
sub first_field {
return unless $_[0] =~ /(\S+)/;
$1;
}