首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何编写一个Perl脚本来检查x列的数量,以便为每个返回值在另一行中打印一个值

如何编写一个Perl脚本来检查x列的数量,以便为每个返回值在另一行中打印一个值
EN

Stack Overflow用户
提问于 2013-03-21 05:01:00
回答 2查看 233关注 0票数 0

我在CSV文件中有数据(IP地址),该文件将是第9-13列。如果其他列中没有值,那么默认情况下,它应该只打印出第9列中的值。有一个输出文件,它将打印一组值和第9列的值(如果值存在,还可以打印到第13列),并将其与一个静态值连接起来,以创建一个别名值。我的问题是,你将如何有效地做到这一点?我有一个可以工作的代码:

代码语言:javascript
运行
复制
my $alias0= "ComponentAliases=['ComputerSystem:$columns[9]'];\n";
my $alias1= "ComponentAliases=['ComputerSystem:$columns[9]','ComputerSystem:$columns[10]'];\n";
my $alias2= "ComponentAliases=['ComputerSystem:$columns[9]','ComputerSystem:$columns[10]','ComputerSystem:$columns[11]'];\n";


        print BAROC "ComputerSystem;\n";
        if(($columns[11] != '')&&($columns[10] != '')) {  print BAROC $alias2 }
        elsif(($columns[11] == '')&&($columns[10] != '')) {  print BAROC $alias1 }
        elsif(($columns[11] == '')&&($columns[10] == '')) { print BAROC $alias0 }

这可以做我想做的事情,但CSV文件可能会有9-13列或9-11列的值,等等。很容易我认为静态地编写它会很好,但我想高效地完成它,以及理解并始终应用最佳实践。我对编写Perl脚本很陌生,但一直被用来解决工作中的问题所吸引。有什么建议吗?

这是输出,顺便说一下:

代码语言:javascript
运行
复制
ComponentAliases=['ComputerSystem:10.1.0.225','ComputerSystem:10.200.252.77','ComputerSystem:10.100.252.77'];
EN

回答 2

Stack Overflow用户

发布于 2013-03-21 07:05:37

效率现在意味着可维护性。尝试保存一两条命令不会节省您太多时间。事实上,如果编译器不知道你在做什么,这实际上可能会使程序的效率更低。

重要的是可读性。去掉$alias之类的东西。这只会让你更难看到你的代码在做什么,而且你可能会在做这样的事情时得到各种各样的副作用。

空白的缺乏也使得你的代码更难理解。一旦我重新格式化您的代码,我立即发现了一个错误。您是这样做的:

代码语言:javascript
运行
复制
if ( ($columns[11] != '') && ($columns[10] != '') )

但是,这是一个字符串比较。您需要这样做:

代码语言:javascript
运行
复制
if ( ( $columns[11] ne '' ) && ( $columns[10] ne '' ) ) {

或者,您可以进一步简化它:

代码语言:javascript
运行
复制
if ( not $column[10] and not $column[11] ) {

这将使您非常清楚您要查找的内容,并且无论列是否包含数字零、空字符串或未定义,都将有效。

这段代码使用了您的逻辑,但我利用了print不会自动在字符串末尾添加\n这一事实。我只是简单地在这条线上继续构建:

代码语言:javascript
运行
复制
if ( $columns[9] ) {
    print BAROC "ComputerSystem;\n";
    print BAROC "ComponentAliases=['ComputerSystem:$columns[9]'";

    if ( $columns[10] ) {
         print BAROC ",ComputerSystem:$columns[10]";
    }
    if ( $columns[11] )  {
        print BAROC ",ComputerSystem:$columns[11]";
    }
    print BAROC "];\n";
}

您提到,如果第9到13列中包含数据,则可能需要这些列。为什么不使用循环呢?

代码语言:javascript
运行
复制
if ( $#columns >= 9 ) {    #There are at least nine columns
    print BAROC "ComputerSystem;\n";
    print BAROC "ComponentAliases=[ComputerSystem:$columns[9]";

    for my $column ( (10..$#columns) ) {
       last if not $column[$column];
       print BAROC ",ComputerSystem:$columns[$columns];
    }
    print BAROC "];\n";
}

如果给我更多的时间,我相信我可以更好地理清逻辑。但是,无论包含数据的列是9列、10列、11列还是43列,这都是有效的。

票数 1
EN

Stack Overflow用户

发布于 2013-03-21 05:09:53

一个线条(不是很优雅,但我喜欢它):

代码语言:javascript
运行
复制
print "ComponentAliases=[".join(",",map {"'ComputerSystem:$_'"} grep {$_ ne ""} @columns[9-13])."]\n";

或者,如果您更喜欢以更容易理解的方式使用相同的代码:

代码语言:javascript
运行
复制
print(  
        "ComponentAliases=[",
        join(
            ",",
            map(    
                "'ComputerSystem:$_'",
                grep (
                        $_ ne "",
                        @columns[9-13]
                     )
               )
            ),  
        "]\n"
     );  
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15534631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档