Linux 我的Perl有多糟糕?获取IP地址并返回完全限定域名的脚本
我邀请你,给我撕一个新的 这段代码完成了任务。它接受一个包含IP列表的.txt文件,并写入一个包含各自完全限定域名的文件 我想知道这段代码在哪些方面写得不好。这里有什么坏习惯 我是一名perl和编程新手。我用谷歌和trail-and-error把这两个词组合在一起。让它工作是令人满意的,但请告诉我如何才能提高Linux 我的Perl有多糟糕?获取IP地址并返回完全限定域名的脚本,linux,perl,networking,dns,reverse-dns,Linux,Perl,Networking,Dns,Reverse Dns,我邀请你,给我撕一个新的 这段代码完成了任务。它接受一个包含IP列表的.txt文件,并写入一个包含各自完全限定域名的文件 我想知道这段代码在哪些方面写得不好。这里有什么坏习惯 我是一名perl和编程新手。我用谷歌和trail-and-error把这两个词组合在一起。让它工作是令人满意的,但请告诉我如何才能提高 use strict; use warnings; use Socket; use autodie; my $filename = 'IPsForFQDN.txt'; #File wi
use strict;
use warnings;
use Socket;
use autodie;
my $filename = 'IPsForFQDN.txt';
#File with list of IPs to lookup.
#One IP address per line like so:
#10.10.10.10
#10.10.10.11
#10.10.10.12
#etc...
open(my $fh, '<:encoding(UTF-8)', $filename)
or die "Could not opne file '$filename' $!";
my $fqdn = '';
while (my $row = <$fh>) {
chomp $row;
print "$row\n";
$fqdn = gethostbyaddr(inet_aton($row), AF_INET);
print $fqdn;
print "\n";
open FILE, ">>fqdn.txt" or die $!;
print FILE $fqdn;
print FILE "\n";
close FILE;
}
print "done\n";
使用严格;
使用警告;
使用插座;
使用自动模具;
my$filename='IPsForFQDN.txt';
#包含要查找的IP列表的文件。
#每行一个IP地址,如下所示:
#10.10.10.10
#10.10.10.11
#10.10.10.12
#等等。。。
打开(my$fh),$!
报告某些内容失败的原因。如果无法打开文件,此处将指出失败的原因。有一节介绍
您正在使用删除每行末尾的换行符
<>当你写的文件有点不同的时候,考虑使用与你在代码中提前阅读的相同的3参数版本(也请看我给你开的链接),并采用相同的编码风格。保持一致性很好,而且这种方法更安全。您正在为您编写的每一行重复打开fqdn.txt
。我只需在循环之前打开它,然后在循环结束时关闭它
哦-您使用的是autodie,因此不需要使用或die
哦-与阅读文件的新样式相比,您也使用了旧式的open
。没有太多工作,所以我尝试了一些重写,并在中添加了注释来解释一些事情。没有错/没有错,只是添加了我的想法和我们在我的位置使用的一些标准
希望这有助于
use strict;
use warnings;
use Socket;
# initialize variables here.
my $filename = "IPsForFQDN.txt";
# open both file handles - once only
# Note safer expression using 2 commas
open(FH, "<", $filename)
or die "Could not opne file '$filename' $!";
# open FILE for appending
open FILE, ">>", "fqdn.txt" or die $!;
# use foreach instead of while - easier syntax (may provoke discussion ;-) )
# replaced $fh for FH - use file handles throughout for consitency
foreach my $row ( <FH> )
{
chomp $row;
# put a regex check in for comments
if( $row !~ m/^#/ )
{
printf ("Row in file %s \n", $row );
# initialize $fqdn here to keep it fresh
my $fqdn = gethostbyaddr(inet_aton($row), AF_INET);
# formatted print to screen (STDOUT)
printf ("FQDN %s \n", $fqdn);
# formatted print to output file
printf FILE ("%s \n", $fqdn);
}
}
# close both file handles - once only
close FILE;
close FH;
print "done\n";
使用严格;
使用警告;
使用插座;
#在这里初始化变量。
my$filename=“IPsForFQDN.txt”;
#打开两个文件句柄-仅打开一次
#注意使用2个逗号的更安全的表达式
打开(FH、“>”、“fqdn.txt”或die$!;
#使用foreach而不是while-更简单的语法(可能引发讨论;-))
#将$fh替换为fh-在整个过程中使用文件句柄以保持一致性
foreach my$行()
{
咀嚼$row;
#将正则表达式签入以获取注释
如果($row!~m/^#/)
{
printf(“文件%s\n中的行,$Row”);
#在此处初始化$fqdn以保持其新鲜
my$fqdn=gethostbyaddr(inet\u aton($row),AF\u inet);
#格式化打印到屏幕(标准输出)
printf(“FQDN%s\n”,$FQDN);
#格式化打印到输出文件
printf文件(“%s\n”,$fqdn);
}
}
#关闭两个文件句柄-仅关闭一次
关闭文件;
关闭FH;
打印“完成”\n;
如果你的代码已经在运行,这个问题会更适合你。大部分看起来不错。我没有什么可以告诉你的。它很简单,可以作为一行代码的候选:perl-MSocket-nwe'my$fqdn=gethostbyaddr(inet_aton($),AF_inet);print$fqdn?$fqdn:,“,”\n”"IPsForFQDN.txt>fqdn.txt
哦,是的,为了保持一致性,我在一些地方用单引号替换了双引号。此外,我更喜欢使用双引号而不是单引号-这源于UNIX系统不将变量替换为单引号#MyIssueWithSingleQuotes:)作为标准,考虑在文件时采用词法文件句柄,避免(除了少数例外)。<代码>前缀> > > <代码> > >更糟糕的是,当您在列表上下文中调用
时,您会将整个文件读入内存,这完全没有必要,因为您只是逐行迭代。正如Kenosis所说,使用词法文件句柄(my$fh
)而不是typeglobs(fh
),后者在范围上是全局的。我想当我说“更容易”时,我的意思是这是我在列表中迭代的首选方式While
是可以的,但是我更喜欢在谈论满足的条件时使用这个(While$a=true)
我认为Perl的优点之一是它的冗长的synatx,在这里你几乎可以为每一行(@list)编写实际的句子
至于使用词法文件句柄——同样,typeglobs是我从小就使用的,也是我首选的语法。要想对内存资源产生重大影响,必须有一个庞大的IP列表。在这种情况下,测试将揭示这一点,并需要重新思考。拥有自己的个人偏好是好的,但你在公共论坛上推广不良做法。也许你不知道。至于内存,如果你能保证你的输入文件总是很小的,即使你已经停止维护代码,并且它被用于你从未预料到的事情,那么无论如何,把它读入内存。我不能保证我写的代码。另外,while(my$row=)
真的那么难读吗?