2016-06-30 17 views
0

非常に限られたメモリでOS 9にアクセスするのが難しい場合にMacperlを使用する前に、Perlの経験はほとんどなく、OS Xでいくつかの方法を試しています。File :: Copyを使用しないシンプルなperlファイルのコピー方法

私は、File :: Copyを使用せずに単純なファイルコピーメソッドを試しています。

次の両方が動作するように表示されます。

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

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

私は$ Rを使用して、$第1の方法にwができないのはなぜ?

第1の方法は、 'while'なしでどのように機能しますか?

これを行うより良い方法はありますか?

答えて

1

Perlの演算子と関数は、コンテキストに応じて異なるものを返すことができます。

最初の方法は、印刷機能が<>演算子のリストコンテキストと呼ばれるものを作成するため動作します。その後、演算子はファイル全体を「スラップイン」します。 2番目の例では

は、<>演算子は(ここではいくつかのアスタリスクが、それはまた別の話です。)一度に1行を返す、スカラコンテキストを作成し、ループの状態で呼び出され

ここコンテキストに関する説明です:http://perlmaven.com/scalar-and-list-context-in-perl

両方のメソッドは、RおよびWファイルハンドル(通常の変数とは異なる旧式のPerlファイルハンドル)と実際にはファイルハンドルを保持する変数を示す$ r/$ w表記で動作するはずです参照。違いは微妙ですが、ほとんどの日常的なユースケースでは、これらは互換的に使用できます。最初の例で$変数を使ってみましたか? Hellmarベッカーの答えに加えて

+0

「slurp」は、OS 9(PPCではiOSではありません)で他の方法より多くのメモリを使用しようとしますか? –

+0

最初に括弧を追加しました。両方とも、両方のタイプのファイルハンドルで動作します。 –

1

print $w <$r>;は動作しません

(構文エラーを与える)FILEHANDLE引数が可変である場合、perlはprintの引数リスト開始($w <$r)を解釈しようとするため、 (http://perldoc.perl.org/functions/print.htmlの注記を参照)。 <$r>の前後に括弧を挿入するにはdisambigue:

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

ありがとうございます - それを修正します –

2

ことは、これを行うには良い方法はありますか?

確かに... File::Copyはコアモジュール(インストール不要)ですので、使用する必要はほとんどありません。

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

また、あなたは、OS-X

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

UPDATEおっと、あなたはOS9にしているあなたのケースでは、基盤となるOSにシステムコールを使用することができますので、私はありませんよどのシステムコールが利用可能であるかを確認してください。

レキシカルファイルハンドルで最初の方法を使用できますが、少し曖昧さを取り除く必要があります。 (お使いのメモリの制約がそれを可能にした場合EDIT

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

心の中で裸これはunidiomaticコードで、あなただけの直接のコピーを作成したい場合は、最初の方法が好ましいです。

+0

このページのさまざまな方法でOS 9のメモリ要件が大きく異なる可能性があるかどうかを知ることが有用な場合は、 –

+0

OS 9の懸念は、OS Xのような保護されたメモリがないことです。ファイルサイズが大きくなるとクラッシュしないようにしたいと思います。 –

関連する問題