简单的perl文件复制方法,不使用File :: Copy

时间:2016-06-30 09:08:46

标签: perl filehandle file-copying

我的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'的情况下工作?

有更好的方法吗?

3 个答案:

答案 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>