【问题标题】:Shift and Split移位和拆分
【发布时间】:2014-03-27 15:05:40
【问题描述】:

如果可能的话,我想让这个 2-Commands 更短,1 行。

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

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

【问题讨论】:

    标签: perl split shift


    【解决方案1】:
    return (split " ", shift)[0];
    

    或者,如果你愿意:

    (split " ", shift)[0];
    

    (sub 的最后一行的结果隐式成为返回值)。

    甚至更短(/r 选项需要 Perl 5.16):

    $_[0]=~s/ .*//r
    

    当然,在实际的生产代码中,您的原始示例更好,因为它是可读的。

    【讨论】:

    • 如果你不在命令中定义 $id,他怎么知道他应该拆分或转移什么?
    • @user3075044,$id 只是任务期间创建的临时变量,没有必要。
    • 我喜欢你的回答,但问题是,首先我移动 $id 的内容,然后我拆分它..所以如果我在子程序中写,只需返回 (split " ", shift)[ 0];还不够吧?
    • @user3075044,没有。您正在从默认数组转移。 @_ 如果它在子程序中,或者 @ARGV 如果不是。
    【解决方案2】:

    因为您只希望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 关键字当然是可选的,但较短并不总是更好。

    【讨论】:

    • 是的,这在技术上对于一般的零宽度分割模式是正确的,但' ' 是一个特例。它会跳过所有前面的空格。
    【解决方案3】:

    使用正则表达式会更紧凑:

    sub first_field {
      return unless $_[0] =~ /(\S+)/;
      $1;
    }
    

    【讨论】:

    • 我预计以下代码会失败:sub ff {$_[0] =~ /(\S+)/;$1;} "test" =~ /(\w+)/; $x = ff('asdf qwer'); $z = ff(' ');。但是,我忘记了捕获变量已本地化到它们的块中,所以 $z 等于 'test' 而不是 'asdf'
    猜你喜欢
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 2014-06-02
    • 1970-01-01
    • 2023-04-06
    • 2021-07-29
    相关资源
    最近更新 更多