【问题标题】:Split newline-delimited string into three variables, # newlines unknown将换行符分隔的字符串拆分为三个变量,# 换行符未知
【发布时间】:2013-12-03 17:13:44
【问题描述】:

我有如下字符串:

string = "thing: thing\nthing: thing\nthing: thing\nthing: thing"

...其中行数(以换行符分隔)最多为 4,最少为 0。我想将第 2、3 和 4 行提取到单独的变量中。但是,如果缺少一行,这将失败。例如,我可能会这样做:

    my @tmparray = split ('\n', $string);
my $var1 = $tmparray[1];
my $var2 = $tmparray[2];
my $var3 = $tmparray[3];

如果数组中没有第四个元素,则上述内容将中断。有关如何更好地处理这种情况的任何建议?

【问题讨论】:

    标签: regex string perl split


    【解决方案1】:

    你可以跳过临时变量直接赋值:

    my ($var0, $var1, $var2, $var3) = split /\n/, $string;
    

    如果分隔字符串中缺少字段,则缺少的变量将是未定义的。这与您使用数组时的行为相同。定义一个字段何时丢失的方法是,它将是未定义的:

    if (defined $var1) {                 # field exists
    

    还可以对字段进行计数,如果使用数组会更容易

    my @fields = split /\n/, $string;
    my $count = @fields;                 # the size of the array
    

    另请注意,拆分模式是正则表达式 (/\n/),而不是字符串。如果您提供一个字符串,它仍将被视为正则表达式,但引用可能会使您感到困惑。因此,请始终使用正则表达式,除非您在空白处使用默认的 ' ' 拆分。请参阅perldoc -f split 了解更多信息。

    【讨论】:

    • 我怎么强调都不为过:总是使用 split /FOO/, $string 而不是 split 'FOO', $string; -- 两者的意思完全一样,但这样你就不会忘记这一点(其他人也不会)。
    • @VectorGorgoth 几乎总是这样,因为在单个文字空间 ' ' 上拆分与在正则表达式 / / 中的单个空间上拆分不同。
    • 是的,但是如果您事先不具体了解该功能,那么模拟 awk 行为将是错误的。换句话说,如果你对 perl split + awk 有足够的了解,需要它,你也知道我在撒谎。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 2020-09-12
    • 2020-09-24
    • 2016-12-27
    • 2015-06-17
    • 1970-01-01
    相关资源
    最近更新 更多