- 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/
所以我试图设置“内容”类的高度,但它似乎不起作用。我对嵌套 DIV 非常陌生,我已经尝试了我在谷歌搜索中发现的修复程序,但似乎没有任何效果。帮助?
好的,所以我一直在四处寻找,但找不到这个问题的答案。但是,我需要将一个 View 嵌套在另一个 View 中。 我有一个 $layout 正在使用我拥有的 default.layout Blade 文
好的,所以我一直在四处寻找,但找不到这个问题的答案。但是,我需要将一个 View 嵌套在另一个 View 中。 我有一个 $layout 正在使用我拥有的 default.layout Blade 文
基本上,我的问题很简单,但它需要知道 Struts 1.1 并且还活着的人。 我尝试构建的伪代码看起来像这样: IF element.method1 = true THEN IF element
我正在尝试将 Excel 嵌套 IF 语句转换为代码语言,但我不确定我是否正确执行此操作,希望能得到一些帮助 这是Excel语句: =IF(D3="Feather",IF(OR(I3>1000,R3=
如果我们创建两个或三个评论并对其进行多次回复,则“有用”链接在单击时会导致问题,它会对具有相同编号的索引执行 ng-click 操作,从而显示具有相同索引的所有文本。如何解决此嵌套问题,以便在单击链接
我在项目中使用Scala,想与Stripe集成,但它只提供Java API。例如,要创建 session ,我使用: val params = new util.HashMap[String, Any
以下代码有一个 Div,其中连续包含四个较小的 Div。四个 Div 中的每一个还包含一个较小的 Div,但此 Div 未显示。我尝试了各种显示和位置组合,看看 div 是否会出现。 classGoa
我在这里有一个问题,循环是: for (i=0; i < n; ++i) for (j = 3; j < n; ++j) { ...
我正在尝试编写代码来显示具有奇数宽度的形状。形状完成后,将其放置在外部形状内。用户将能够输入用于形状的字符和行数。我希望生成一个形状,并通过 for 循环生成一个外部形状。 ***** .
$(".globalTabs").each(function(){ var $globalTabs = $(this); var parent = $globalTabs.parent
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve th
所以我在这个问题上遇到了一些麻烦,因为变量 i。我只是不确定在第二个 while 循环中如何处理它。对于我的外循环,我知道它将运行 log_4(n^2) 次迭代。对于内部 while 循环,我计算的迭
我似乎找不到在枚举上应用多个 if/then 逻辑的工作方式。 anyOf 不应用条件逻辑,而是表示如果其中任何一个匹配则很好。 allOf 再次不应用条件逻辑,而是测试属性/必填字段的超集。 这是一
如何访问 ReaderT 的内部 monad。 在我的例子中,我有类型: newtype VCSSetupAction a = VCSSetupAction (ReaderT (Maybe VCSCo
这个问题在这里已经有了答案: Add leading zeroes/0's to existing Excel values to certain length (7 个回答) 7年前关闭。 我正在寻
我已经绑定(bind)了很多 AND/OR 函数的组合并且没有运气。 这是我需要创建的: 在 B 列中,我有公司 ID,范围从两个数字字符到六个数字字符。 我需要在 B 列中的每个公司 ID 之前的每
我是 VBA 新手,在尝试编写的宏中使用 If 语句时遇到了一些困难。每个月我都会收到一份 Excel 报告,其中列出了我们公司的哪些员工执行了某些任务。我正在编写的宏旨在将每个员工的数据复制并粘贴到
如果在 B 列中找到单元格 A1 中的值,则使用文本 321 填充除非在 C 列中找到单元格 A1 中的值,在这种情况下填充文本 121反而。如果单元格 A1 的内容不在 B 列或 C 列中,则使用
我有几十万个地址。其中一些在整数之后有粒子。如 4356 A Horse Avenue , 其他格式正常4358 Horse Avenue .有些有“A”,有些有“B”。我正在尝试删除整数和粒子之间的
我是一名优秀的程序员,十分优秀!