- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
好吧,我现在搞砸了。我想使用严格和警告来创建一个合适的脚本(对我来说仍然是一个挑战;)。但现在我完全迷失了。我一直在看太多的例子,我完全糊涂了。我正在尝试使用纬度/经度计算两点之间的距离。我想我已经用 gis::distance 覆盖了那部分。但问题是我试图找到彼此相距 5000m 以内的目的地。 (如果目的地相同则跳过)。因此,当它找到距离另一个目的地 5000 米以内的目的地时,我希望它把它放在第一个文件中的最后一个元素之后。
两个输入文件是相同的,以下是它们的外观。这两个文件都有大约 45k 行。
Europe;3;France;23;Parijs;42545;48,856555;2,350976
Europe;3;France;23;Parisot;84459;44,264381;1,857827
Europe;3;France;23;Parlan;11337;44,828976;2,172435
Europe;3;France;23;Parnac;35670;46,4533;1,4425
Europe;3;France;23;Parnans;22065;45,1097;5,1456
Europe;3;France;23;Parijs;42545;48,856555;2,350976;Parlan;11337;200
Europe;3;France;23;Parisot;84459;44,264381;1,857827;
Europe;3;France;23;Parlan;11337;44,828976;2,172435;
Europe;3;France;23;Parnac;35670;46,4533;1,4425;Parisot;84459;2000;Parnans;22065;350
Europe;3;France;23;Parnans;22065;45,1097;5,1456;
Global symbol "$infile1" requires explicit package name at E:\etc.pl line 17.
Execution of E:\etc.pl aborted due to compilation errors.
use strict;
use warnings;
use GIS::Distance::Lite qw(distance);
my $inputfile1 = shift || die "Give input!\n";
my $inputfile2 = shift || die "Give more input!\n";
my $outputfile = shift || die "Give output!\n";
open my $INFILE1, '<', $inputfile1 or die "In use/Not found :$!\n";
open my $INFILE2, '<', $inputfile2 or die "In use/Not found :$!\n";
open my $OUTFILE, '>', $outputfile or die "In use/Not found :$!\n";
my $maxdist = 5000;
my $mindist = 0.0001;
while ( my @infile1 ){
my @elements = split(";",$infile1);
my $lat1 = $elements[6];
my $lon1 = $elements[7];
$lat1 =~ s/,/./g;
$lon1 =~ s/,/./g;
seek my $infile2, 0, 0;
print "1. $lat1\n";
print "2. $lon1\n";
while ( my @infile2 ){
my @loopelements = split(";",$infile2);
my $lat2 = $loopelements[6];
my $lon2 = $loopelements[7];
$lat2 =~ s/,/./g;
$lon2 =~ s/,/./g;
print "3. $lat1\n";
print "4. $lon1\n";
my $distance = distance($lat1, $lon1 => $lat2, $lon2); # Afstand berekenen tussen latlon1 and latlon2
print "5. $distance\n";
my $afstand = sprintf("%.4f",$distance);
print "6. $afstand\n";
if (($afstand < $maxdist) and (!($elements[4] == $loopelements[4]))){
push (@elements, $afstand,$loopelements[4],$loopelements[5]);
print "7. $afstand\n";
} else {
next;
}
}
@elements = join(";",@elements); # add ';' to all elements
print OUTFILE "@elements";
#if ($i == 10) {last;}
}
close(INFILE1);
close(INFILE2);
close(OUTFILE);
use strict;
use warnings;
use GIS::Distance::Lite qw(distance);
my $inputfile1 = shift || die "Give input!\n";
my $inputfile2 = shift || die "Give more input!\n";
my $outputfile = shift || die "Give output!\n";
open my $INFILE1, '<', $inputfile1 or die "In use/Not found :$!\n";
open my $INFILE2, '<', $inputfile2 or die "In use/Not found :$!\n";
open my $OUTFILE, '>', $outputfile or die "In use/Not found :$!\n";
my $maxdist = 3000;
my $mindist = 0.0001;
while (my $infile1 = <$INFILE1> ){
chomp $infile1;
my @elements = split(";",$infile1);
print "1. $elements[6]\n";
print "2. $elements[7]\n";
my $lat1 = $elements[6];
my $lon1 = $elements[7];
if ((($lat1 and $lon1) ne '0') and (!($lat1 and $lon1) eq "")){
$lat1 =~ s/,/./;
$lon1 =~ s/,/./;
print "lat1: $lat1\n";
print "lon1: $lon1\n";
} else {
next;
}
print "3. $lat1\n";
print "4. $lon1\n";
seek $INFILE2, 0, 0;
while ( my $infile2 = <$INFILE2> ){
chomp $infile2;
my @loopelements = split(";",$infile2);
print "5. $elements[6]\n";
print "6. $elements[7]\n";
my $lat2 = $loopelements[6];
my $lon2 = $loopelements[7];
if ((($lat2 and $lon2) ne '0') and (!($lat2 and $lon2) eq "")){
$lat2 =~ s/,/./;
$lon2 =~ s/,/./;
print "lat2: $lat1\n";
print "lon2: $lon1\n";
} else {
next;
}
my $distance = distance($lat1, $lon1 => $lat2, $lon2); # Afstand berekenen tussen latlon1 and latlon2
print "7. $distance\n";
my $afstand = sprintf("%.4f",$distance);
print "8. $afstand\n";
if ($afstand < $maxdist && $elements[4] != $loopelements[4]){
push (@elements, $afstand, $loopelements[4],$loopelements[5]);
print "9. $afstand\n";
} else {
next;
}
}
print $OUTFILE join(";",@elements), "\n";
}
close($INFILE1);
close($INFILE2);
close($OUTFILE);
最佳答案
你已经很不错了。让我们来看看您的错误消息。
Global symbol "$infile1" requires explicit package name at E:\etc.pl line 17.
$INFILE1
。稍后我将更多地讨论词法。
open my $INFILE1, '<', $inputfile1 or die "In use/Not found :$!\n";
INFILE1
),那么您可以这样做。
但是 稍后(第 17 行)您使用
$infile1
。
my @elements = split(";",$infile1);
my
),因此它会引发此错误。但这还不是全部。
while ( my @infile1 ){
while
循环不会停止。曾经。
@infile1
和
my
的声明总是返回一个真值,因为它总是有效的。所以你永远不会打破循环。
while (my $infile1 = <$INFILE1> ){
my @elements = split(";",$infile1);
while
循环头中的赋值只有在有一行从文件句柄返回时才会为真。一旦到达文件末尾,它将返回 undef
,从而结束循环。好极了。还要注意下一行中的 $infile1
与 split
现在是如何正确的。chomp
添加到组合中,因为文件末尾有换行符:while (my $infile1 = <$INFILE1> ){
chomp $infile1;
my @elements = split(";",$infile1);
seek
行。看起来您想从第一个文件的每一行的开头读取第二个文件。这在某种程度上是有道理的,但效率很低。我稍后再谈。不过,您确实需要更改 my
。您不必在此处创建新变量。另外,使用正确的名称:seek $INFILE2, 0, 0;
while
循环:while (my $infile2 = <$INFILE2>){
chomp $infile2;
my @loopelements = split(";",$infile2);
my $distance = distance($lat1, $lon1 => $lat2, $lon2);
=>
是另一种写逗号 ( ,
) 的方式。它有时被称为胖逗号,它使阅读更容易,例如,散列分配。 if (($afstand < $maxdist) and (!($elements[4] == $loopelements[4]))){
and
通常用于做错误检查。请参阅 perldoc 了解原因。您应该改用 &&
。因为它具有更高的优先级,所以您可以省略括号。您还可以更改 !($a == $b)
构造以改用 !=
运算符。 但是 因为它保存了城市名称,而且它是一个字符串而不是数字,所以您需要使用 ne
,它与 eq
相反。所以这一行现在变成:if ($afstand < $maxdist && $elements[4] ne $loopelements[4]){
join
进行 @elements
并将其分配给自身。这是比较奇怪的。它将用一个只有一个元素的新数组替换数组 - 连接字符串。让我们把那条线留到下一个项目符号,然后再看。 print
语句,但您现在使用的是从未创建的全局文件句柄 OUTFILE
。相反,您需要使用顶部的词法文件句柄 $OUTFILE
。如果我们现在将上一行中的 join
直接添加到打印语句中,并在末尾添加一个 \n
换行符,该行将变为:print $OUTFILE join(";",@elements), "\n";
close($INFILE1);
close($INFILE2);
close($OUTFILE);
use strict;
use warnings;
use GIS::Distance::Lite qw(distance);
my $inputfile1 = shift || die "Give input!\n";
my $inputfile2 = shift || die "Give more input!\n";
my $outputfile = shift || die "Give output!\n";
open my $INFILE1, '<', $inputfile1 or die "In use/Not found :$!\n";
open my $INFILE2, '<', $inputfile2 or die "In use/Not found :$!\n";
open my $OUTFILE, '>', $outputfile or die "In use/Not found :$!\n";
my $maxdist = 5000;
my $mindist = 0.0001;
while (my $infile1 = <$INFILE1> ){
chomp $infile1;
my @elements = split(";",$infile1);
my $lat1 = $elements[6];
my $lon1 = $elements[7];
$lat1 =~ s/,/./g;
$lon1 =~ s/,/./g;
print "1. $lat1\n";
print "2. $lon1\n";
seek $INFILE2, 0, 0;
while ( my $infile2 = <$INFILE2> ){
chomp $infile2;
my @loopelements = split(";",$infile2);
my $lat2 = $loopelements[6];
my $lon2 = $loopelements[7];
$lat2 =~ s/,/./g;
$lon2 =~ s/,/./g;
print "3. $lat1\n";
print "4. $lon1\n";
my $distance = distance($lat1, $lon1 => $lat2, $lon2); # Afstand berekenen tussen latlon1 and latlon2
print "5. $distance\n";
my $afstand = sprintf("%.4f",$distance);
print "6. $afstand\n";
if ($afstand < $maxdist && $elements[4] ne $loopelements[4]){
push (@elements, $afstand,$loopelements[4],$loopelements[5]);
print "7. $afstand\n";
} else {
next;
}
}
print $OUTFILE join(";",@elements), "\n";
}
close($INFILE1);
close($INFILE2);
close($OUTFILE);
use strict;
use warnings;
use GIS::Distance::Lite qw(distance);
use feature qw(say);
my $inputfile1 = shift || die "first file missing";
my $inputfile2 = shift || die "second file missing";
my $outputfile = shift || die "output file missing!";
# Read the second file first
my @file2; # save the lines of INFILE2 as array refs
open my $INFILE2, '<', $inputfile2 or die "In use/Not found :$!";
while ( my $infile2 = <$INFILE2> ){
chomp $infile2;
my @loopelements = split(/;/, $infile2);
$loopelements[6] =~ y/,/./;
$loopelements[7] =~ y/,/./;
push @file2, \@loopelements;
}
close($INFILE2);
open my $INFILE1, '<', $inputfile1 or die "In use/Not found :$!";
open my $OUTFILE, '>', $outputfile or die "In use/Not found :$!";
my $maxdist = 5000;
my $mindist = 0.0001;
while (my $infile1 = <$INFILE1> ){
chomp $infile1;
my @elements = split(";",$infile1);
my $lat1 = $elements[6];
my $lon1 = $elements[7];
$lat1 =~ y/,/./;
$lon1 =~ y/,/./;
say "1. $lat1";
say "2. $lon1";
FILE2: foreach my $loopelements ( @file2 ){
my ($lat2, $lon2) = @$loopelements[6, 7];
say "3. $lat2";
say "4. $lon2";
my $distance = distance($lat1, $lon1 => $lat2, $lon2); # Afstand berekenen tussen latlon1 and latlon2
say "5. $distance";
my $afstand = sprintf("%.4f",$distance);
say "6. $afstand";
if ($afstand < $maxdist && $elements[4] ne $$loopelements[4]){
push (@elements, $afstand, $$loopelements[4], $$loopelements[5]);
say "7. $afstand";
} else {
next FILE2;
}
}
say $OUTFILE join(";",@elements);
}
close($INFILE1);
close($OUTFILE);
use feature qw(say)
。 say
与 print
相同,但添加了一个新行。这样可以节省一些打字时间。另请参阅 feature
了解更多信息。 die
语句中删除了“\n”字符。如果你在那里放一个新行,它会从输出中删除行号。如果这是故意的,请忽略此建议。以下是 Perldoc 对此的看法:If the last element of LIST does not end in a newline, the current script line number and input line number (if any) are also printed, and a newline is supplied.
while
循环移到另一个 while
循环之外的程序顶部。该文件被放入数组 @file2
中。每个元素都包含一个包含行字段的数组 ref。逗号已更改为句号。s///
替换运算符更改为 y///
(缺少 tr///
)音译运算符。因为你只改变一个符号,这就足够了。它也更快。即使您保留正则表达式替换,您也不需要 /g
修饰符,因为浮点数只有一个逗号,因此不必进行多次替换。while
更改为 foreach
循环,以迭代新的 @file2
数组的元素。为了清楚起见,我确实保留了 $lat2
和 $lon2
变量。您可以省略这些,直接使用 array(ref) 元素。在作业中,我使用 array slice 将其放入一行。 $loopelements
替换了 @loopelements
并且它是一个数组引用,我们现在需要使用 $$loopelements[$index]
访问存储在其中的数据。 Europe;3;France;23;Parijs;42545;48,856555;2,350976
Europe;3;France;23;Parisot;84459;44,264381;1,857827
Europe;3;France;23;Parlan;11337;44,828976;2,172435
Europe;3;France;23;Parnac;35670;46,4533;1,4425
Europe;3;France;23;Parnans;22065;45,1097;5,1456
Europe;3;France;23;Parlan;11337;44,828976;2,172435
Europe;3;France;23;Parnac;35670;46,4533;1,4425
Europe;3;France;23;Parnans;22065;45,1097;5,1456
Europe;3;France;23;Parijs;42545;48,856555;2,350976
Europe;3;France;23;Parisot;84459;44,264381;1,857827
关于perl - 嵌套while循环以计算多个目的地的距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11625649/
我是 PHP 新手。我一直在脚本中使用 for 循环、while 循环、foreach 循环。我想知道 哪个性能更好? 选择循环的标准是什么? 当我们在另一个循环中循环时应该使用哪个? 我一直想知道要
我在高中的编程课上,我的作业是制作一个基本的小计和顶级计算器,但我在一家餐馆工作,所以制作一个只能让你在一种食物中读到。因此,我尝试让它能够接收多种食品并将它们添加到一个价格变量中。抱歉,如果某些代码
这是我正在学习的一本教科书。 var ingredients = ["eggs", "milk", "flour", "sugar", "baking soda", "baking powder",
我正在从字符串中提取数字并将其传递给函数。我想给它加 1,然后返回字符串,同时保留前导零。我可以使用 while 循环来完成此操作,但不能使用 for 循环。 for 循环只是跳过零。 var add
编辑:我已经在程序的输出中进行了编辑。 该程序要求估计给定值 mu。用户给出一个值 mu,同时还提供了四个不等于 1 的不同数字(称为 w、x、y、z)。然后,程序尝试使用 de Jaeger 公式找
我正在编写一个算法,该算法对一个整数数组从末尾到开头执行一个大循环,其中包含一个 if 条件。第一次条件为假时,循环可以终止。 因此,对于 for 循环,如果条件为假,它会继续迭代并进行简单的变量更改
现在我已经习惯了在内存非常有限的情况下进行编程,但我没有答案的一个问题是:哪个内存效率更高;- for(;;) 或 while() ?还是它们可以平等互换?如果有的话,还要对效率问题发表评论! 最佳答
这个问题已经有答案了: How do I compare strings in Java? (23 个回答) 已关闭 8 年前。 我正在尝试创建一个小程序,我可以在其中读取该程序的单词。如果单词有 6
这个问题在这里已经有了答案: python : list index out of range error while iteratively popping elements (12 个答案) 关
我正在尝试向用户请求 4 到 10 之间的整数。如果他们回答超出该范围,它将进入循环。当用户第一次正确输入数字时,它不会中断并继续执行 else 语句。如果用户在 else 语句中正确输入数字,它将正
我尝试创建一个带有嵌套 foreach 循环的列表。第一个循环是循环一些数字,第二个循环是循环日期。我想给一个日期写一个数字。所以还有另一个功能来检查它。但结果是数字多次写入日期。 Out 是这样的:
我想要做的事情是使用循环创建一个数组,然后在另一个类中调用该数组,这不会做,也可能永远不会做。解决这个问题最好的方法是什么?我已经寻找了所有解决方案,但它们无法编译。感谢您的帮助。 import ja
我尝试创建一个带有嵌套 foreach 循环的列表。第一个循环是循环一些数字,第二个循环是循环日期。我想给一个日期写一个数字。所以还有另一个功能来检查它。但结果是数字多次写入日期。 Out 是这样的:
我正在模拟一家快餐店三个多小时。这三个小时分为 18 个间隔,每个间隔 600 秒。每个间隔都会输出有关这 600 秒内发生的情况的统计信息。 我原来的结构是这样的: int i; for (i=0;
这个问题已经有答案了: IE8 for...in enumerator (3 个回答) How do I check if an object has a specific property in J
哪个对性能更好?这可能与其他编程语言不一致,所以如果它们不同,或者如果你能用你对特定语言的知识回答我的问题,请解释。 我将使用 c++ 作为示例,但我想知道它在 java、c 或任何其他主流语言中的工
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我是 C 编程和编写代码的新手,以确定 M 测试用例的质因数分解。如果我一次只扫描一次,该功能本身就可以工作,但是当我尝试执行 M 次时却惨遭失败。 我不知道为什么 scanf() 循环有问题。 in
这个问题已经有答案了: JavaScript by reference vs. by value [duplicate] (4 个回答) 已关闭 3 年前。 我在使用 TSlint 时遇到问题,并且理
我尝试在下面的代码中添加 foreach 或 for 循环,以便为 Charts.js 创建多个数据集。这将允许我在此折线图上创建多条线。 我有一个 PHP 对象,我可以对其进行编码以稍后填充变量,但
我是一名优秀的程序员,十分优秀!