gpt4 book ai didi

arrays - 珀尔。使用直到功能

转载 作者:行者123 更新时间:2023-12-04 19:11:49 26 4
gpt4 key购买 nike

我有一个简单的数据文件。文件中的每一行都有四个元素。有些行没有空白条目。其他行有第一个条目,其余三个是空白的,或者更确切地说是“填充”了一个空格。它是一个制表符分隔的文件。

输入文件示例:

    .
.
.
30 13387412 34.80391242 sSN_FIRST
30 13387412 34.80391242 sSN5_40
30.1
30.2
30.3
30.4
31 14740248 65.60590089 s32138223_44
31 14740248 65.60590089 s321382_LAST
.
.
.

重申一下,我的文件中的“空白”实际上包含一个空格,如果这很重要的话。

我的总体目标是在整个文件中“填写”第二列和第三列(第四列被忽略)。为了做到这一点,我需要我的脚本来识别空白的连续行集,加上紧接在前面的行和紧接在连续空行集之后的行。在上面的示例中,这将是第 2 - 7 行。一旦我能做到这一点,我就可以使用已填充的侧翼行中的信息来帮助“填充”中间行中缺失的条目。

我一直在试验 until函数,但我没有成功地将它与读取数据线的循环耦合。例如,我可以阅读这些行并找到空行:
open( my $FILE, "<$mapfile" );
my @file = <$FILE>;
close $FILE;

for ( my $i = 1 ; $i < scalar @file ; $i++ )
{
my @entries = split( '\t', $file[ $i ] );
if ( $entries[ 1 ] =~ m/ / )
{
print $file[ $i ]."\n";
}
}

但我正在尝试使用 until功能,以便读取行并搜索我正在寻找的连续行集(“空白”行加上两个侧面的“完整”行)。例如:
until ( $file[ a line ] =~ m/ / && $file[ another line ] =~ m/ / )   
{
my linear interpolation here;
}

谁能给我一个关于如何结合一种方法来读取数组和比较行以在文件中找到我需要的集合的提示?

最佳答案

你想要实现的是一个缓存算法:记住(缓存)以前的值,如果没有新的出现就使用它们。您甚至不需要为此使用正则表达式。 :)

除了缓存旧值之外,您还需要缓存中间的行。因为你只需要标签,所以你只需要捕获那些标签。然后,当您到达下一个整行时,您可以进行插值并发出结果。

这就是我要怎么做。它比我的原始示例稍微复杂一些,但适用相同的原则:只存储中间行,然后在到达终端时发出结果。

use strict;
use warnings;
use feature 'say';


# Get start conditions, and cache those numbers.

sub read_block
{
my $line = <DATA>;
return 1 unless defined $line; # we're done if nothing more to read

# Process and store data from the first line in the block.
chomp $line;
my ($last_label, $last_num1, $last_num2, $last_label2) = split /\t/, $line;

# Keep reading lines until we find the end of the block.
my @label_cache;
my $found_last = 0;
my ($label1, $num1, $num2, $label2);
while (!$found_last)
{
$line = <DATA>;
chomp $line;
($label1, $num1, $num2, $label2) = split /\t/, $line;
if (defined $num1 && defined $num2)
{
$found_last = 1; # We have final numbers! We can interpolate now.
}
else
{
push @label_cache, $label1;
}
}

# Begin display. Show the first line of the block.
say "$last_label\t$last_num1\t$last_num2\t$last_label2";

# Calculate the slope for interpolation: (last - first) / difference
my $slope1 = ($num1 - $last_num1) / (@label_cache + 1);
my $slope2 = ($num2 - $last_num2) / (@label_cache + 1);
my $distance = 0;

# Display each label and the lines inside.
foreach my $label (@label_cache)
{
++$distance;
say $label, "\t",
$slope1 * $distance + $last_num1, "\t",
$slope2 * $distance + $last_num2;
}

# Display the final line in the block.
say "$label1\t$num1\t$num2\t$label2";

# Not done yet, so return a 'false' value.
return 0;
}

# Main part of the script

my $done = 0;
while (! $done)
{
$done = read_block();
}


__DATA__
a 3 4 end
e
f
g
h
i
k 15 26 start
k 15 26 end
o
p
q
r
s 3 5 start
s 3 5 end
v
w
x
y 14 16 start

发出:
a       3       4       end
e 5 7.66666666666667
f 7 11.3333333333333
g 9 15
h 11 18.6666666666667
i 13 22.3333333333333
k 15 26 start
k 15 26 end
o 12.6 21.8
p 10.2 17.6
q 7.8 13.4
r 5.4 9.2
s 3 5 start
s 3 5 end
v 5.75 7.75
w 8.5 10.5
x 11.25 13.25
y 14 16 start

然后,当然,您可以执行您需要的任何类型的数字舍入或格式设置。 :)

关于arrays - 珀尔。使用直到功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14245511/

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