我的perl经验非常少,并且在我尝试在更难以访问内存非常有限的操作系统9上使用Macperl之前,已经在OS X上尝试了一些方法。
我一直在尝试使用简单的文件复制方法而不使用File :: Copy。
以下两项似乎都有效:
open R,"<old";
open W,">new";
print W <R>;
open $r,"<old";
open $w,">new";
while (<$r>) { print $w $_ }
为什么我不能在第一种方法中使用$ r和$ w?
第一种方法如何在没有'while'的情况下工作?
有更好的方法吗?
答案 0 :(得分:2)
有更好的方法吗?
肯定有...... File::Copy
是核心模块(无需安装),因此没有理由避免使用它。
use File::Copy;
copy('old', 'new');
或者,您可以使用系统调用底层操作系统,在您的情况下,OS-X
system('cp', 'old', 'new');
更新糟糕,您使用的是OS9,因此我不确定哪些系统调用可用。
您可以将第一种方法用于词法文件句柄,但需要消除歧义。
open $r, '<', 'old';
open $w, '>', 'new';
print {$w} <$r>;
请记住这是一个单一的代码,如果你只想创建一个直接拷贝,第一种方法更可取(编辑如果你的内存限制允许它)。
答案 1 :(得分:1)
Perl运算符和函数可以根据其上下文的期望返回不同的东西。
第一种方法有效,因为print函数为&lt;&gt;创建了所谓的列表上下文。操作员 - 然后操作员将&#34;啜饮&#34;整个文件。
在第二个例子中,&lt;&gt;在循环的条件下调用operator,它创建一个标量上下文,一次返回一行(这里有一些星号,但那是另一个故事。)
以下是有关上下文的一些解释:http://perlmaven.com/scalar-and-list-context-in-perl。
并且,这两种方法都应该使用R和W文件句柄(它们是与常规变量不同的旧式Perl文件句柄),并且使用$ r / $ w表示法实际表示包含文件句柄的变量参考。差异很微妙,但在大多数日常用例中,这些可以互换使用。您是否尝试过在第一个示例中使用$变量?
答案 2 :(得分:1)
除了Hellmar Becker的回答:
print $w <$r>;
不起作用(给出语法错误),因为如果FILEHANDLE参数是变量,perl会尝试解释print
的参数列表开头({{1} })作为运算符(参见http://perldoc.perl.org/functions/print.html中的注释)。消除括号围绕$w <$r
:
<$r>