我无法从 __DATA__ 来源打印某些信息

I am having difficulty printing certain information from a __DATA__ source

我在家庭作业中无法打印马萨诸塞州的邮政编码。该信息是从 DATA 中提取的,无法对其进行编辑以使其更容易。

我不是要直接回答,只是可能需要一些不同方法的指导,这是我的第一门编程语言,所以我仍在努力理解。感谢您的时间。

我已经能够使用下面的第一部分代码成功地打印出整个地址。

我尝试使用代码的第二部分再次拆分 $address,但由于第 5 行的拆分参数过多而不断出现错误。我尝试了此代码的不同格式,但没有一个是成功的。

use warnings;
my ($name, $phone, $address, $Bday, $salary);
while (<DATA>){
($name, $phone, $address, $Bday, $salary) = split(":", $_);

print "$address\n" if $address =~ m/MA/g;

}

use warnings;
my ($name, $phone, $address, $Bday, $salary);
while (<DATA>){
($name, $phone, $address, $Bday, $salary) = split(":", $_);
($address) = split (",",$home,$town,$state,$zip);

print "$zip\n" if $address =~ m/MA/g;

}

__DATA__
Tommy Savage: 408-724-0140:122 Oxbow Court, Sunnyvale, CA 94087:5/19/66:34200
Lesle Kerstin: 408-456-1234:4 Harvard Square, Boston, MA 02133:4/22/62:52600
JonDeLoach: 408-253-3122:123 Park St., San Jose, CA 94086:7/25/53:85100
Ephram Hardy: 293-259-5395:235 Carlton Lane, Joliet, IL 73858:8/12/20:56700
Betty Boop: 245-836-8357:635 Cutesy Lane, Hollywood, CA 91464:6/23/23:14500
William Kopf: 846-836-2837:6937 Ware Road, Milton, PA 93756:9/21/46:43500
Norma Corder: 397-857-2753:74 Pine Street, Deadborn, MI 23874:3/28/45:245700 
James Ikeda: 834-938-8376:23445 Aster Ave., Allentown, NJ 83745:12/1/38:45000
Lori Gortz: 327-832-5728:3465 Mirlo Street, Peabody, MA 34756:10/2/65:35200
Barbara Kerz: 385-573-8326:832 Ponce Drive, Gary, IN 83756:12/15/46:268500

输出只需是 MA

的邮政编码
02133
34756

您收到的错误消息表明您没有正确使用 split。我猜你的意思是:

($home,$town,$state,$zip) = split(",", $address);

而不是:

($address) = split (",",$home,$town,$state,$zip);

但是修复这个问题仍然不会return你期望的结果,主要是因为州和邮政编码不是用逗号分隔的,而是用space分隔的。正如您的代码一样,$zip 将最终未定义,而 $state 将同时包含州名和邮政编码。

其他注意事项:

  • 总是use strictuse warnings
  • split 通常将正则表达式作为第一个参数而不是纯字符串;它还将 $_ 作为默认参数,与许多其他 perl 内置函数一样。

考虑:

use warnings;
use strict;

while (<DATA>){
    my $address = (split /:/)[2];
    if ($address =~ m/MA/g) {
        my ($zip) = ($address =~ /(\d+)$/);
        print "$zip\n";
    }
}

解释:

  • 因为地址是您唯一需要的部分,所以不要捕获其他部分;这避免了实例化无用的变量

  • 邮政编码由地址末尾的一串数字组成


这是一个更短的语法,它只使用一个正则表达式来解析字符串,捕获相关部分并打印它:

while (<DATA>){
    print "\n" if /^[^:]+:[^:]+:[^:]+MA (\d+):/;
}

正则表达式解释:

  • ^是字符串的开头
  • [^:]+:表示一组尽可能多的字符,除了:(至少一个),后面跟着:
  • 第三组非:字符应以字符串MA、一个space和一串数字结尾;数字周围的括号表示应捕获字符串的这一部分(然后它将作为 )