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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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
在perl中计算2个点(2组坐标)_Perl - Fatal编程技术网

在perl中计算2个点(2组坐标)

在perl中计算2个点(2组坐标),perl,Perl,我试图计算同一区域内一组坐标之间的距离。使用类型distance=sqrt(x2-x1)^2+(y2-y1)^2)。我知道我很快就要成功了,但我不知怎么搞的,所以我需要一些帮助。 以下是我写的: use strict; use warnings; use feature 'say'; use Data::Dumper; use POSIX; #gia dekadikous se akairaious my$x=0; my$y=0; my$i=0; my $flag = 1; my @temp

我试图计算同一区域内一组坐标之间的距离。使用类型distance=sqrt(x2-x1)^2+(y2-y1)^2)。我知道我很快就要成功了,但我不知怎么搞的,所以我需要一些帮助。
以下是我写的:

use strict;
use warnings;
use feature 'say';
use Data::Dumper;
use POSIX;  #gia dekadikous se akairaious

my$x=0;
my$y=0;
my$i=0;
my $flag = 1;
my @temp; #gia na kratisei tin loopa. an den isxei shmainei oti den exoume pinaka
my @proigoumeno;
my @dis;   
my @row;  
#my $counter=0;
my$final;
my $filename = 'myfile.txt';

open(my $fh, '<:encoding(UTF-8)', $filename)
or die "Could not open file '$filename' $!";

while(<$fh>) {
    @temp = split ' ';
    if( $flag ) {
        @proigoumeno = @temp;
        $flag = 0;
        next;
    }
if( $#temp != $#proigoumeno ) {
    } else {

my @data = map {(($proigoumeno[$_]-$temp[$_])) } 0..$#temp;
    push my@dis, \@data;

foreach $row(@dis){
my$x = $row [$i] ;
my$y = $row [$i+1];
my$final = sqrt(($x**2)+($y**2));
my$ceil=ceil(my$final;) 
         #my$counter =my$counter+1;
say join ' ',$ceil; 
}
}
    }
所以我想要的输出是这样的:

area1   73070   74098   stop
area1   79689   79934   stop
area2   57000   59336   signal
area2   69391   72882   signal
area3   65205   66473   triangle
area3   66888   68294   triangle
area4   44491   48216   block
area4   269762  273388   block
area5   390882  392312   signal
area5    85172  85501    signal
area1   DISTANCE  stop
area2   DISTANCE  signal
area3   DISTANCE  triangle
area4   DISTANCE  block
area5   DISTANCE  signal
其中距离=输入文件的sqrt(第二列的第二行-第二列的第一行^2+第三列的第二行-第二列的第一行^2)

关于我的期望输出:
a)我想打印文件的第一列以及坐标计算后的第四列。因为我的级别不足以完成我想要的任务,所以我只能在开始时使用计数器打印第一列,然后像这样打印它“说join'area,$counter'”,或者在输出文件中使用命令行| paste来添加这些列。但是在代码中,我不知道如何做到这一点,因此如果有人能在这方面提供帮助,我将不胜感激。

b)起初,我只通过对两列进行减法来测试代码,效果很好,但当我试图在foreach循环中添加sqrt时,我弄糟了

请参见下面的代码示例。我希望你能学到一些新的有用的东西,尝试改变你的编程风格

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

use Data::Dumper;

my $debug = 0;

my %points;

my($id,$distance,$name);
my $count = 1;

while(<DATA>){
    my ($id,$x,$y,$name)    = split '\s+';

    $points{$id}{$count} = { x => $x, y => $y };
    $points{$id}{name} = $name;

    $count++;
    $count = 1 if $count > 2;
}

say Dumper(\%points) if $debug;

$~ = 'STDOUT_HEAD';
write;
$~ = 'STDOUT';

foreach $id ( sort keys %points) {
    $name     = $points{$id}{name};
    $distance = distance($points{$id});
    write;
}

$~ = 'STDOUT_BOTTOM';
write;

sub distance {
    my $p = shift;

    my $d = sqrt( ($p->{2}{x} - $p->{1}{x})**2 + ($p->{2}{y} - $p->{1}{y})**2 );

    return $d
}

format STDOUT_HEAD = 
+--------+------------+----------+
| Area   | Distance   | Name     |
+--------+------------+----------+
.

format STDOUT =
| @<<<<< | @######.## | @<<<<<<< |
$id, $distance, $name
.

format STDOUT_BOTTOM =
+--------+------------+----------+
.

__DATA__
area1   73070   74098   stop
area1   79689   79934   stop
area2   57000   59336   signal
area2   69391   72882   signal
area3   65205   66473   triangle
area3   66888   68294   triangle
area4   44491   48216   block
area4   269762  273388   block
area5   390882  392312   signal
area5    85172  85501    signal

我发布的代码就是我试图运行的代码。。。我知道在第38、42、44行有一些错误,这是使用foreach循环造成的。当我在foreach循环中添加$final=sqrt(($x2)+($y2))作为代码行时,我的问题就开始了。不,问题来自于这个jibberish:
ceil(My$final;)
一旦修复,使用
$row
而不声明它就会出现错误。对我的$row(…){…}使用
,一旦它被修复,使用不存在的数组
@row
就会出现错误
$row[…]
应该是
$row->[…]
(数组的元素被
$row
中的引用引用引用)我不明白为什么我的问题得到-1。。。。我为自己编写代码付出了很多努力。我对perl一无所知。如果我能正确地编写代码,我就不会在这里发布任何问题。。很好用!!!。我对输出非常兴奋。我一次又一次地按命令提示符上的enter按钮,只看到输出正在运行。我将保留它作为模板从现在开始。非常感谢你!
+--------+------------+----------+
| Area   | Distance   | Name     |
+--------+------------+----------+
| area1  |    8824.40 | stop     |
| area2  |   18358.40 | signal   |
| area3  |    2479.62 | triangle |
| area4  |  318511.31 | block    |
| area5  |  433118.45 | signal   |
+--------+------------+----------+