我无法从 __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 strict
和use 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和一串数字结尾;数字周围的括号表示应捕获字符串的这一部分(然后它将作为
)
我在家庭作业中无法打印马萨诸塞州的邮政编码。该信息是从 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 strict
和use 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和一串数字结尾;数字周围的括号表示应捕获字符串的这一部分(然后它将作为)