2

下面我有一个我试图操作的数据列表。我想拆分列并以不同的排列重新加入它们。

我想用第三个元素切换数组的最后一个元素,但我遇到了问题。由于数组的最后一个元素在末尾包含一个行字符,所以当我将它切换为第三个时,它会将所有内容都踢下一行。

代码

while (<>) {
    my @flds = split /,/;
    DO STUFF HERE;
    ETC;
    print join ",", @flds[ 0, 1, 3, 2 ];    # switches 3rd element with last
}

样本数据

1,josh,Hello,Company_name
1,josh,Hello,Company_name
1,josh,Hello,Company_name
1,josh,Hello,Company_name
1,josh,Hello,Company_name
1,josh,Hello,Company_name

我的结果- 踢了一条线。

1,josh,Company_name
,Hello1,josh,Company_name
,Hello1,josh,Company_name
,Hello1,josh,Company_name
,Hello1,josh,Company_name
,Hello1,josh,Company_name,Hello

*期望的结果**

1,josh,Company_name,Hello
1,josh,Company_name,Hello
1,josh,Company_name,Hello
1,josh,Company_name,Hello
1,josh,Company_name,Hello
1,josh,Company_name,Hello

我知道它与 chomp 有关,但是当我 chomp 第一个或最后一个元素时,所有 \n 都会被删除。当我在两者之间使用 chomp 时,什么也没有发生。任何人都可以帮忙吗?

4

3 回答 3

4

chomp从参数中删除尾随换行符。由于您的四个字段实际上都不应该包含换行符,因此这可能是您出于数据处理目的而要做的事情。chomp您甚至可以在将行拆分为字段之前删除换行符,然后在每个记录之后添加一个换行符,并使用最终的打印语句:

while (<>) {
    chomp; # Automatically operates on $_
    my @flds = split /,/;
    DO STUFF HERE;
    ETC;
    print join(",", @flds[0,1,3,2]) . "\n"; # switches 3rd element with last
}
于 2014-10-31T15:12:30.207 回答
0
while ( <> ) {
    chomp; 
    my @flds = split /,/;
       ... rest of your stuff
 }

while循环中,随着每一行的处理,$_被设置为该行的内容。chomp默认情况下,作用于$_并删除尾随换行符。split也默认为 using $_,因此可以正常工作。

从技术上讲,将要发生的是最后一个元素,@flds包括该行的尾随\n- 例如$flds[3]

于 2014-10-31T15:10:25.643 回答
0

chomp() 函数将(通常)从字符串末尾删除任何换行符。我们通常说的原因是它实际上删除了与 $/ (输入记录分隔符)的当前值匹配的任何字符,并且 $/ 默认为换行符。

示例 1. Chomping 字符串 当从文件或用户读取数据时,您通常会使用 chomp()。例如,当从标准输入流 (STDIN) 读取用户输入时,每行数据都会有一个换行符。chomp() 在这种情况下非常有用,因为您不需要编写正则表达式,也不必担心它会删除所需的字符。

while (my $text = <STDIN>) {
chomp($text);
print "You entered '$text'\n";
last if ($text eq '');

}

该程序的示例用法和输出是:

a word 你输入了“a word” some text 你输入了“some text”

你进来了 ''

于 2014-11-05T07:32:22.620 回答