我是perl的新手。 在我的输入文件中是:
git diff ..master
问题:我不确定获取输入并将名称设置为键并将数字设置为值的正确方法是什么。例如,“ james”是键,而“ 84012345”是值。
这是我的代码:
james1
84012345
aaron5
2332111 42332
2345112 18238
wayne[2]
3505554
答案 0 :(得分:1)
我很快就会仔细检查您的代码:
#!/usr/bin/perl -w
不建议使用 -w
。您应该改为use warnings;
(您已经在做,因此只需删除-w
)。
use strict;
use warnings;
很好。
use Data::Dumper;
my $input= $ARGV[0];
好。
my %hash;
在需要变量之前不要声明它们。在尽可能小的范围内声明它们,通常是在首次使用它们之前。
open my $data , '<', $input or die " cannot open file : $_\n";
错误消息的开头有一个虚假的空格,此时$_
未设置。您应该改为使用$input
(无法打开的文件的名称)和$!
(错误原因)。
my @names = split ' ', $data;
my @values = split ' ', $data;
嗯,这没有道理。 $data
是文件句柄,而不是字符串。即使是字符串,此代码也会为@names
和@values
分配相同的列表。
@hash{@names} = @values;
print Dumper \%hash;
我的版本(未试用):
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
@ARGV == 1
or die "Usage: $0 FILE\n";
my $file = $ARGV[0];
my %hash;
{
open my $fh, '<', $file or die "$0: can't open $file: $!\n";
local $/ = '';
while (my $paragraph = readline $fh) {
my @words = split ' ', $paragraph;
my $key = shift @words;
$hash{$key} = \@words;
}
}
print Dumper \%hash;
想法是在输入循环的持续时间内将$/
(input record separator)设置为""
,这使readline
返回整个段落,而不是行。 / p>
每个段落的第一个(用空格隔开)单词被当作键;剩下的单词就是值。
答案 1 :(得分:0)
您已使用open()
打开了文件,并将文件句柄附加到$data
。从文件读取数据的常规方法是遍历每一行,如下所示:
#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;
my $input = $ARGV[0];
my %hash;
open my $data , '<', $input or die " cannot open file : $_\n";
while (my $line = <$data>) {
chomp $line; # Removes extra newlines (\n)
if ($line) { # Checks if line is empty
my ($key, $value) = split ' ', $line;
$hash{$key} = $value;
}
}
print Dumper \%hash;
答案 2 :(得分:0)
OK,+ 1以使用strict
和warnings
。
首先看一下$/
变量,该变量用于控制读入文件时如何将其分解为记录。
$data
是一个文件句柄,您需要从文件中提取数据;如果大小不大,则可以将其全部加载到数组中;如果文件很大,则可以一次遍历每个记录。请参见<>
perlop
运算符
看着您的代码,您似乎希望从输入文件中获得以下数据结构
%hash(
james1 =>[
84012345
],
aaron5 => [
2332111,
42332,
2345112,
18238
]
'wayne[2]' => [
3505554,
]
)
有关如何操作的信息,请参见perldsc
。
可以使用Perl附带的perldoc
命令阅读所有文档。单独运行perldoc
将为您提供一些使用方法的提示,而运行perldoc perldoc
将为您提供远远超出当前所需信息的信息。