输入字符串未正确排列

时间:2013-12-02 23:14:38

标签: perl

这是脚本:

#!/usr/bin/perl
 open (FILE, 'data.txt');
 open (FILE2, '>>data2.txt');
 while (<FILE>) {
 chomp;
 ($name, $email, $phone) = split("\t");
 print FILE2 "Name: $name\n";
 print FILE2 "Email: $email\n";
 print FILE2 "Phone: $phone\n";
 }
 close (FILE);
exit;

这是输入文件:

Larry larry@example.com 111-1111   
Curly curly@example.com 222-2222   
Moe moe@example.com 333-3333  

以下是我得到的输出:

Name: Larry larry@example.com 111-1111  
Email:  
Phone:  
Name: Curly curly@example.com 222-2222  
Email:  
Phone:  
Name: Moe moe@example.com 333-3333   
Email:  
Phone:  

电子邮件应该在电子邮件行中,电话号码应该在电话线上。有谁知道为什么这不起作用?我道歉,我正在努力快速了解Perl,这样我就可以创建一个脚本,为我的项目做我需要做的事情。我从here

获得了这个脚本

3 个答案:

答案 0 :(得分:3)

split("\t")在选项卡上拆分输入,看起来输入中的字段由简单空格分隔。相反,尝试

之一
split(/ /);      # split on single space
split(/\s+/);    # split on any "whitespace" - space, tab, etc.

请注意,split的第一个参数始终被视为正则表达式,为清楚起见,在编写split调用时,应使用正则表达式而不是字符串。

答案 1 :(得分:1)

我刚试过你的代码。

尝试添加use strict,使用警告。然后运行它。

我正在为手机和电子邮件变量使用未初始化的变量。

#!usr/bin/env perl

use strict;
use warnings;

 open (FILE, 'data.txt');
 open (FILE2, '>>data2.txt');
 while (<FILE>) {
     chomp;
     my ($name, $email, $phone) = split(" ");
     print FILE2 "Name: $name\n";
     print FILE2 "Email: $email\n";
     print FILE2 "Phone: $phone\n";
 }
 close (FILE);
exit;

答案 2 :(得分:0)

mod发布了正确的答案,这似乎是你在选项卡上拆分空格分隔的数据。我想补充说,这可以通过单行解决:

perl -ane 'printf "Name: %s\nEmail: %s\nPhone: %s\n", @F;' data.txt > data2.txt

这只是将autosplit -a开关与printf组合在一起。非常简单。 “引擎盖下”的代码如下所示:

while (<>) {
    my @F = split;
    printf "Name: %s\nEmail: %s\nPhone: %s\n", @F;
}