gpt4 book ai didi

arrays - Perl:使用数组列表来选择特定列

转载 作者:行者123 更新时间:2023-12-02 01:19:39 25 4
gpt4 key购买 nike

我有一个 python 脚本,它正在读取数据并仅将特定列输出到文件中。

我想在 Perl 中做同样的事情。我已经在 Perl 中完成了此操作(下面的脚本),但我无法像在 Python 中那样使用数组和选择器。

这里是嵌入数据的脚本

#!/usr/bin/python

from StringIO import StringIO

path = "/tmp/log.csv"

__DATA__ = '''
20180704150930|rtsp|645645643|30193|211|KLM|KLM00SD624817.ts|172.30.16.34|127299264|VERB|01780000|21103|277|server01|OK
20180704150931|api|456456546|30130|234|VC3|VC300179201139.ts|172.30.16.138|192271838|VERB|05540000|23404|414|server01|OK
20180704150931|api|465456786|30154|443|BAD|BAD004416550.ts|172.30.16.50|280212202|VERB|04740000|44301|18|server01|OK
20180704150931|api|5437863735|30157|383|VSS|VSS0011062009.ts|172.30.16.66|312727922|VERB|05700000|38303|381|server01|OK
20180704150931|api|3453432|30215|223|VAE|VAE00TF548197.ts|172.30.16.74|114127126|VERB|05060000|22305|35|server01|OK
20180704150931|api|312121|30044|487|BOV|BOVVAE00549424.ts|172.30.16.58|69139448|VERB|05300000|48708|131|server01|OK
20180704150931|rtsp|453432123|30127|203|GZD|GZD0900032066.ts|172.30.16.58|83164150|VERB|05460000|20303|793|server01|OK
20180704150932|api|12345348|30154|465|TYH|TYH0011224259.ts|172.30.16.50|279556843|VERB|04900000|46503|241|server01|OK
20180704150932|api|4343212312|30154|326|VAE|VAE00TF548637.ts|172.30.16.3|28966797|VERB|04740000|32601|969|server01|OK
20180704150932|api|312175665|64530|305|TTT|TTT000000011852.ts|172.30.16.98|47868183|VERB|04740000|30501|275|server01|OK
'''

selector = [0, 3, 5, 7]

__DATA__ = StringIO(__DATA__)
with open(path + ".py.txt", "w") as output:
for line in __DATA__:
line = line.rstrip( "\r\t\n" )
if not line.strip(): continue # skip the empty line
columns = line.split("|")
newColumns = [ columns[i] for i in selector ]
output.write("|".join(newColumns) + "\n")
print ("|".join(newColumns))

问题

所以,使用 Perl 脚本我有一个像 Python 一样的数组在我的脚本中,我这样做时没有在循环中使用数组我直接 $tab[0] 等...我不知道如何对数组列表执行相同的操作我想改用@list

这里是 Perl 中的相同代码

#!/usr/bin/perl
use strict;
use warnings;
use autodie;

my $path = "/tmp/log.csv";
my @list = (0, 3, 5, 7);

open(OUT, ">", $path . ".pl.txt");
while (<DATA>) {
chomp;
my @tab = split(/\|/, $_);
my $record = join('|', $tab[0], $tab[3], $tab[5], $tab[7]);
print $record, "\n";
print OUT $record, "\n";
}

close(OUT);


__DATA__
20180704150930|rtsp|645645643|30193|211|KLM|KLM00SD624817.ts|172.30.16.34|127299264|VERB|01780000|21103|277|server01|OK
20180704150931|api|456456546|30130|234|VC3|VC300179201139.ts|172.30.16.138|192271838|VERB|05540000|23404|414|server01|OK
20180704150931|api|465456786|30154|443|BAD|BAD004416550.ts|172.30.16.50|280212202|VERB|04740000|44301|18|server01|OK
20180704150931|api|5437863735|30157|383|VSS|VSS0011062009.ts|172.30.16.66|312727922|VERB|05700000|38303|381|server01|OK
20180704150931|api|3453432|30215|223|VAE|VAE00TF548197.ts|172.30.16.74|114127126|VERB|05060000|22305|35|server01|OK
20180704150931|api|312121|30044|487|BOV|BOVVAE00549424.ts|172.30.16.58|69139448|VERB|05300000|48708|131|server01|OK
20180704150931|rtsp|453432123|30127|203|GZD|GZD0900032066.ts|172.30.16.58|83164150|VERB|05460000|20303|793|server01|OK
20180704150932|api|12345348|30154|465|TYH|TYH0011224259.ts|172.30.16.50|279556843|VERB|04900000|46503|241|server01|OK
20180704150932|api|4343212312|30154|326|VAE|VAE00TF548637.ts|172.30.16.3|28966797|VERB|04740000|32601|969|server01|OK
20180704150932|api|312175665|64530|305|TTT|TTT000000011852.ts|172.30.16.98|47868183|VERB|04740000|30501|275|server01|OK

最佳答案

您不能将循环构造放入 Perl 中的数据结构中。这将是一个语法错误。

但是您可以使用array slice .

my $record = join('|', @tab[0, 3, 5, 7]);

请注意 sigil 如何从 $ 更改为 @,因为我们现在返回一个列表。当然,您可以将这四个数字放入循环外部定义的另一个数组中并使用它。

my @indexes = ( 0, 3, 5 );
my @slice = @array[ @indexes ];

关于arrays - Perl:使用数组列表来选择特定列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51289426/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com