Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 我的Perl有多糟糕?获取IP地址并返回完全限定域名的脚本_Linux_Perl_Networking_Dns_Reverse Dns - Fatal编程技术网

Linux 我的Perl有多糟糕?获取IP地址并返回完全限定域名的脚本

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

我邀请你,给我撕一个新的

这段代码完成了任务。它接受一个包含IP列表的.txt文件,并写入一个包含各自完全限定域名的文件

我想知道这段代码在哪些方面写得不好。这里有什么坏习惯

我是一名perl和编程新手。我用谷歌和trail-and-error把这两个词组合在一起。让它工作是令人满意的,但请告诉我如何才能提高

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=)
真的那么难读吗?