Perl filehandle-won';不要写入文件

Perl filehandle-won';不要写入文件,perl,file-io,Perl,File Io,我无法让下面的脚本使用文件句柄写入文件data.txt。两个文件都在同一个文件夹中,所以这不是问题所在。自从我开始使用Perl以来,我注意到要运行脚本,我必须使用完整的路径:c:\programs\scriptname.pl以及相同的方法来输入文件。我认为这可能是问题所在,并尝试了下面的语法,但也不起作用 open(WRITE, ">c:\programs\data.txt") || die "Unable to open file data.txt: $!"; 这是我的剧本。我已经检查

我无法让下面的脚本使用文件句柄写入文件data.txt。两个文件都在同一个文件夹中,所以这不是问题所在。自从我开始使用Perl以来,我注意到要运行脚本,我必须使用完整的路径:c:\programs\scriptname.pl以及相同的方法来输入文件。我认为这可能是问题所在,并尝试了下面的语法,但也不起作用

open(WRITE, ">c:\programs\data.txt") || die "Unable to open file data.txt: $!";
这是我的剧本。我已经检查了语法,直到它让我发疯,看不到问题。任何帮助都将不胜感激!。我也很困惑,为什么die函数没有启动

#!c:\strawberry\perl\bin\perl.exe

#strict
#diagnostics
#warnings

#obtain info in variables to be written to data.txt
print("What is your name?");
$name = <STDIN>;
print("How old are you?");
$age = <STDIN>;
print("What is your email address?");
$email = <STDIN>;

#data.txt is in the same file as this file.
open(WRITE, ">data.txt") || die "Unable to open file data.txt: $!";

#print information to data.txt
print WRITE "Hi, $name, you are \s $age and your email is \s $email";

#close the connection
close(WRITE);
#!c:\草莓\perl\bin\perl.exe
#严格的
#诊断学
#警告
#获取要写入data.txt的变量中的信息
打印(“你叫什么名字?”);
$name=;
打印(“你多大了?”);
$age=;
打印(“您的电子邮件地址是什么?”);
$email=;
#data.txt与此文件位于同一文件中。
打开(写入“>data.txt”)| | die“无法打开文件data.txt:$!”;
#将信息打印到data.txt
打印并写下“嗨,$name,您是\s$age,您的电子邮件是\s$email”;
#关闭连接
关闭(写入);
我是如何解决这个问题的

我在c:驱动器上安装了草莓Perl.exe,通过安装程序安装并使用安装程序,c上还有一个文件夹,我的脚本在其中,这意味着我无法对文件进行红/写操作(定向或使用函数,即打开的文件),并且我始终必须使用完整路径来启动脚本。有人建议将解释器安装在原来的位置,并将脚本文件移动到桌面(将OS命令保留在脚本的第一行,因为解释器仍在最初的位置),我解决了这个问题。现在,我可以通过一次单击来运行脚本,通过CMD提示符读取/写入并附加到文件中,并且可以轻松地使用Perl函数。

您必须使用“/”来确保可移植性,因此:
open(write,“>c:/programs/data.txt”)
注意:我假设
c:/programs
文件夹存在

您必须使用“/”以确保可移植性,因此:
open(WRITE,“>c:/programs/data.txt”)
注意:我假设
c:/programs
文件夹存在

您可能想试试

使用严格;
使用警告;
使用autodie;#open现在将在失败时死亡
使用FindBin;
使用File::Spec::Functions'catfile';
我的$filename=catfile$FindBin::Bin,'data.txt';
#获取要写入data.txt的变量中的信息
打印(“你叫什么名字?”);我的$name=;
打印(“你多大了?”);我的年龄=;
打印(“您的电子邮件地址是什么?”);我的$email=;
{
打开(我的$fh,“>”,$filename);
打印{$fh}“嗨,$name,你是$age,你的电子邮件是$email\n”;
收盘价$fh;
}
您可能想试试

使用严格;
使用警告;
使用autodie;#open现在将在失败时死亡
使用FindBin;
使用File::Spec::Functions'catfile';
我的$filename=catfile$FindBin::Bin,'data.txt';
#获取要写入data.txt的变量中的信息
打印(“你叫什么名字?”);我的$name=;
打印(“你多大了?”);我的年龄=;
打印(“您的电子邮件地址是什么?”);我的$email=;
{
打开(我的$fh,“>”,$filename);
打印{$fh}“嗨,$name,你是$age,你的电子邮件是$email\n”;
收盘价$fh;
}

如果您在尝试打印到data.txt时遇到访问问题,可以将该行更改为:

print WRITE "Hi, $name, you are \s $age and your email is \s $email" || die $!;
获取更多信息。只读文件将导致此错误消息:

Unable to open file data.txt: Permission denied at perl.pl line 12, <STDIN> line 3.
无法打开文件data.txt:perl.pl第12行第3行的权限被拒绝。

如果您在尝试打印到data.txt时遇到访问问题,可以将该行更改为:

print WRITE "Hi, $name, you are \s $age and your email is \s $email" || die $!;
获取更多信息。只读文件将导致此错误消息:

Unable to open file data.txt: Permission denied at perl.pl line 12, <STDIN> line 3.
无法打开文件data.txt:perl.pl第12行第3行的权限被拒绝。

反斜杠在双引号字符串中有特殊含义。试着避开反斜杠

open(WRITE, ">c:\\programs\\data.txt") || die ...;
或者,由于没有插值变量,请切换到单引号

open(WRITE, '>c:\programs\data.txt') || die ...;
还值得使用open和lexicalfilehandles的三参数版本

open(my $write_fh, '>', 'c:\programs\data.txt') || die ...;

反斜杠在双引号字符串中有特殊含义。试着避开反斜杠

open(WRITE, ">c:\\programs\\data.txt") || die ...;
或者,由于没有插值变量,请切换到单引号

open(WRITE, '>c:\programs\data.txt') || die ...;
还值得使用open和lexicalfilehandles的三参数版本

open(my $write_fh, '>', 'c:\programs\data.txt') || die ...;

错误消息说什么?它什么也没说。没有一个-脚本运行,询问3个问题,然后停止。尝试
打印写“嗨,$name,你是\s$age,你的电子邮件是\s$email”或死“无法写:$!”
不,非常感谢,但也没有纠正它。错误消息说什么?它什么也没说。没有一个-脚本运行,询问3个问题,然后停止。请尝试
print WRITE“Hi,$name,you's$age,you's$email,you's$email”或die“not WRITE:$!”
note,非常感谢ysth,但这也没有解决。是的,两个文件都在同一个文件夹中(我知道这是一个问题)。非常感谢,尽管这仍然不起作用!。我也很困惑,为什么die函数没有启动。我认为文件名以
c:
开头会自动阻止它的可移植性。您应该说使用
/
\\
使其正常工作。如果你想讨论可移植性,你应该讨论使用or以及and和Nope,这也不能解决它。谢谢非常感谢。是的,两个文件都在同一个文件夹中(我知道这是个问题)。非常感谢,尽管这仍然不起作用!。我也很困惑,为什么die函数没有启动。我认为文件名以
c:
开头会自动阻止它的可移植性。您应该说使用
/
\\
使其正常工作。如果你想讨论可移植性,你应该讨论使用or以及and和Nope,这也不能解决它。谢谢非常感谢。