2016-06-30 36 views
0

我有很少的perl经验,并试图在OS X上尝试几种方法之前,我试图使用Macperl更难以访问非常有限的内存的OS 9。简单的perl文件复制方法没有使用文件::复制

我一直在尝试简单的文件复制方法,而不使用File :: Copy。

两个以下似乎工作:

open R,"<old"; 
open W,">new"; 
print W <R>; 

open $r,"<old"; 
open $w,">new"; 
while (<$r>) { print $w $_ } 

为什么我不能用$ r和$ W与第一种方法?

第一种方法如何在没有'while'的情况下工作?

有没有更好的方法来做到这一点?

回答

1

Perl操作符和函数可以根据它们的上下文期望返回不同的东西。

第一种方法是可行的,因为print函数为<>运算符创建了所谓的列表上下文 - 那么运算符将“啜泣”整个文件。

在第二个例子中,<>运算符是所谓的循环,它创建了一个标量环境的条件下,在一个时间返回一条线(在此一些星号,但是另一回事。)

这里是关于上下文的一些解释:http://perlmaven.com/scalar-and-list-context-in-perl

而且,这两种方法都应该使用R和W文件句柄(它们是与常规变量不同的旧式Perl文件句柄),并且使用$ r/$ w表示法来表示实际上表示变量的文件句柄。差别很微妙,但在大多数日常使用情况下,这些可以互换使用。你有没有尝试在第一个例子中使用$变量?

+0

'slurp'试图在OS 9(PPC不是iOS)中使用更多的内存比另一种方法? –

+0

现在我已经为第一个括号添加了括号,他们都使用这两种类型的文件句柄。 –

1

除了Hellmar贝克尔的答案:

print $w <$r>;不起作用(给出一个语法错误),因为如果FILEHANDLE参数是一个变量,perl的试图解释开始print的参数列表($w <$r)作为操作员(请参阅http://perldoc.perl.org/functions/print.html中的注)。为了disambigue的<$r>周围放括号:

print $w (<$r>); 
+0

谢谢 - 修正了这个问题 –

2

有没有更好的方式来做到这一点?

肯定是... File::Copy是一个核心模块(没有安装要求),所以没有理由避免使用它。

use File::Copy; 
copy('old', 'new'); 

或者,您可以使用系统调用底层的操作系统,你的情况,OS-X

system('cp', 'old', 'new'); 

UPDATE哎呀,你在OS9,所以我不确定可用的系统调用。

你可以使用你的第一个方法与词法文件句柄,但你需要消除一点歧义。

open $r, '<', 'old'; 
open $w, '>', 'new'; 
print {$w} <$r>; 

裸记住,这是unidiomatic代码,如果你只是想创建一个直接拷贝,第一种方法是最好(编辑如果你的内存限制允许的话)。

+0

如果知道OS 9的内存需求是否可能会显着不同于此页面上的各种方法,将会有所帮助。 –

+0

我对OS 9的担心是它没有像OS X那样的受保护的内存 - 我希望它不会在文件大小增加时崩溃。 –