我在CSV文件中有数据(IP地址),该文件将是第9-13列。如果其他列中没有值,那么默认情况下,它应该只打印出第9列中的值。有一个输出文件,它将打印一组值和第9列的值(如果值存在,还可以打印到第13列),并将其与一个静态值连接起来,以创建一个别名值。我的问题是,你将如何有效地做到这一点?我有一个可以工作的代码:
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脚本很陌生,但一直被用来解决工作中的问题所吸引。有什么建议吗?
这是输出,顺便说一下:
ComponentAliases=['ComputerSystem:10.1.0.225','ComputerSystem:10.200.252.77','ComputerSystem:10.100.252.77'];
发布于 2013-03-21 07:05:37
效率现在意味着可维护性。尝试保存一两条命令不会节省您太多时间。事实上,如果编译器不知道你在做什么,这实际上可能会使程序的效率更低。
重要的是可读性。去掉$alias
之类的东西。这只会让你更难看到你的代码在做什么,而且你可能会在做这样的事情时得到各种各样的副作用。
空白的缺乏也使得你的代码更难理解。一旦我重新格式化您的代码,我立即发现了一个错误。您是这样做的:
if ( ($columns[11] != '') && ($columns[10] != '') )
但是,这是一个字符串比较。您需要这样做:
if ( ( $columns[11] ne '' ) && ( $columns[10] ne '' ) ) {
或者,您可以进一步简化它:
if ( not $column[10] and not $column[11] ) {
这将使您非常清楚您要查找的内容,并且无论列是否包含数字零、空字符串或未定义,都将有效。
这段代码使用了您的逻辑,但我利用了print
不会自动在字符串末尾添加\n
这一事实。我只是简单地在这条线上继续构建:
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列中包含数据,则可能需要这些列。为什么不使用循环呢?
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列,这都是有效的。
发布于 2013-03-21 05:09:53
一个线条(不是很优雅,但我喜欢它):
print "ComponentAliases=[".join(",",map {"'ComputerSystem:$_'"} grep {$_ ne ""} @columns[9-13])."]\n";
或者,如果您更喜欢以更容易理解的方式使用相同的代码:
print(
"ComponentAliases=[",
join(
",",
map(
"'ComputerSystem:$_'",
grep (
$_ ne "",
@columns[9-13]
)
)
),
"]\n"
);
https://stackoverflow.com/questions/15534631
复制相似问题