转移和拆分

时间:2014-03-27 15:05:41

标签: perl split shift

我想让这个2命令更短,如果可能的话就行1行。

my $id = shift;
my @splittedID = split(" ", $id);
return $splittedID[0];

但它应该具有相同的功能。感谢

3 个答案:

答案 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;
}