如何在Perl中用不同的子例程写入同一个文件?
我在使用Perl将数据写入文件时遇到一些问题如何在Perl中用不同的子例程写入同一个文件?,perl,Perl,我在使用Perl将数据写入文件时遇到一些问题 sub startNewOrder{ my $name = makeUniqueFileName(); open (ORDER, ">$name.txt") or die "can't open file: $!\n"; format ORDER_TOP = PRODUCT<<<<<<<<<<<<<<<<&l
sub startNewOrder{
my $name = makeUniqueFileName();
open (ORDER, ">$name.txt") or die "can't open file: $!\n";
format ORDER_TOP =
PRODUCT<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<CODE<<<<<<<<AANTAL<<<<EENHEIDSPRIJS<<<<<<TOTAAL<<<<<<<
.
format ORDER =
@<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @<<<<<<<< @<<<< @<<<<<< @<<<<<
$title, $code, $amount, $price, $total
.
close (ORDER);
}
%inventory
是一个哈希表,其中productcode为键,数组的标题、价格和金额为值。
这里有两个问题:
当我输入一个无效的产品编号时,我仍然必须输入一个金额,即使我的代码说它应该在检查是否有具有给定代码的产品后直接打印错误
第二个问题是写作似乎不起作用。它总是给出一个“没有这样的文件或目录”错误。有没有一种方法可以打开我在第一个子目录中创建的订单文件,而不必将$name
设置为非本地?或者只是一种写入此文件的方式?我真的不知道怎么从这里开始。我真的找不到太多关于写一个以前关闭过的文件的信息,也找不到其他子文件
感谢您的帮助
Harm您应该首先在代码中添加以下行:
use strict;
use warnings;
他们会发现潜在的打字错误。例如,$inventaris
是与$inventory
不同的变量。你真的想有两个变量吗?很难从代码中分辨出来。类似地,您真的有一个名为$naam
的变量吗
是的,可以从两个单独的子节点写入文件。当前,$name
是您的startNewOrder
子系统的本地子系统。使它对其他子系统可见的一种方法是在代码的开头声明它,使它成为代码文件的全局子系统。能否将格式
移动到与写入
相同的子项中
在您的代码中,更适合使用而不是
使用检查哈希键是否存在比将其与返回的值进行比较更好
使用严格;
使用警告;
my$name=makeUniqueFileName();
#样本数据
我的库存百分比=(
c1=>[1..3],
c2=>[4..6]
);
addToOrder();
子addToOrder{
打印“给出产品代码:\n”;
我的$code=;
chomp$代码;
打印“给予金额:\n”;
我的$amount=;
咀嚼$amount;
if(不存在$inventory{$code}){
打印“此产品不存在\n”;
}
#等等。。。
}
我意识到我没有回答你所有的问题。也许您可以一次只关注一个问题,并提供一个包含少量实际数据的自包含、可运行的示例。我经常通过将代码简化为一个最小的示例来解决我自己的问题,这个示例仍然会重现问题。您应该首先在代码中添加以下行:
use strict;
use warnings;
他们会发现潜在的打字错误。例如,$inventaris
是与$inventory
不同的变量。你真的想有两个变量吗?很难从代码中分辨出来。类似地,您真的有一个名为$naam
的变量吗
是的,可以从两个单独的子节点写入文件。当前,$name
是您的startNewOrder
子系统的本地子系统。使它对其他子系统可见的一种方法是在代码的开头声明它,使它成为代码文件的全局子系统。能否将格式
移动到与写入
相同的子项中
在您的代码中,更适合使用而不是
使用检查哈希键是否存在比将其与返回的值进行比较更好
使用严格;
使用警告;
my$name=makeUniqueFileName();
#样本数据
我的库存百分比=(
c1=>[1..3],
c2=>[4..6]
);
addToOrder();
子addToOrder{
打印“给出产品代码:\n”;
我的$code=;
chomp$代码;
打印“给予金额:\n”;
我的$amount=;
咀嚼$amount;
if(不存在$inventory{$code}){
打印“此产品不存在\n”;
}
#等等。。。
}
我意识到我没有回答你所有的问题。也许您可以一次只关注一个问题,并提供一个包含少量实际数据的自包含、可运行的示例。我经常通过将代码缩减到一个最小的示例来解决自己的问题,这个示例仍然会再现问题。子例程应该尽可能少地工作,并尽可能保持最小的范围。在您的情况下,您不想在每个子例程中都打开一个文件。打开文件一次并传递打开的文件句柄。您不必每次都关闭并重新打开文件 由于要使用格式,因此必须使用裸字文件句柄:
my $name = makeUniqueFileName();
open ORDER, '>', $name or die ...;
start_new_order( \*ORDER );
add_to_order( \*ORDER );
sub start_new_order {
local *ORDER = shift;
...
write ORDER;
}
sub add_to_order {
local *ORDER = shift;
...
write ORDER;
}
您可以在任何地方定义格式。您不必在子例程中定义它们,因此只需将它们单独放在文件的末尾。子例程应尽可能少做工作,并保持尽可能小的范围。在您的情况下,您不想在每个子例程中都打开一个文件。打开文件一次并传递打开的文件句柄。您不必每次都关闭并重新打开文件 由于要使用格式,因此必须使用裸字文件句柄:
my $name = makeUniqueFileName();
open ORDER, '>', $name or die ...;
start_new_order( \*ORDER );
add_to_order( \*ORDER );
sub start_new_order {
local *ORDER = shift;
...
write ORDER;
}
sub add_to_order {
local *ORDER = shift;
...
write ORDER;
}
您可以在任何地方定义格式。您不必在子例程中定义它们,所以只需将它们单独放在文件末尾即可