perlでa.txtとb.txtを結合しall.txtにしたいと思い

perl環境で
#!/usr/bin/perl
$ cat a.txt b.txt > all.txt
というコードを書いて実行したのですが
Bareword found where operator expected at aa.pl line 2, near "$cat a"
(Missing operator before a?)
syntax error at aa.pl line 2, near "$cat a"
Execution of aa.pl aborted due to compilation errors.

というエラーが出てしましました。
どうすればテキストファイルを結合することができるでしょうか?

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2013/02/24 15:46:52
  • 終了:2013/03/03 15:50:04

回答(4件)

id:iwaim No.1

iwaim回答回数215ベストアンサー獲得回数192013/02/24 15:58:04

ポイント25pt

system関数を使えばcatなども実行できます。しかし、Perlでちゃんとファイルをopenしたりエラー処理を入れたりした方がいいんじゃないかなあ。

#!/usr/bin/perl

my $cat_bin = '/bin/cat';

system("$cat_bin a.txt b.txt > all.txt");
id:takanii

指定されたパスが見つかりません。と出て来ました
おそらく何かをインストールしないとだめのようです。

2013/02/24 16:25:45
id:oil999 No.2

oil999回答回数1728ベストアンサー獲得回数3202013/02/24 16:05:30

ポイント25pt

外部コマンド実行は $ ではなく、バッククォートです。
以下のようにしてみてください。

#!/usr/bin/perl
`cat a.txt b.txt > all.txt`
id:oil999

Windows環境で実行しているのでしたら、下記のようにしてください。

`copy a.txt+b.txt all.txt`
2013/02/24 18:44:01
id:a-kuma3 No.3

a-kuma3回答回数4522ベストアンサー獲得回数18792013/02/24 16:06:43

ポイント25pt
$ cat a.txt b.txt > all.txt

これは、シェルのコマンド(行頭の $ はプロンプト)なので、perl ではなくシェルに食わせます。

#! /usr/bin/sh
cat a.txt b.txt > all.txt

最初の一行を perl → sh に変えたのと、行頭の $ を削除してます。

実行権限を付けるか、/usr/bin/sh で実行します。




追記です。

'cat' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

どうやら、Windows 環境で動かそうとしているようなので、unix の cat コマンドのような動作をする perl スクリプトの方が、質問の答えのような気がしてきました。

while (<>) {
    print;
}

上記の内容でテキストファイルを作ります。
ファイル名は、仮に cat.pl としておきます。

で、コマンドプロンプトから以下のように実行します。

d> perl cat.pl a.txt b.txt > all.txt

d> はプロンプトのつもりです。

id:JULY No.4

JULY回答回数966ベストアンサー獲得回数2472013/02/24 18:26:50

ポイント25pt

'cat' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
と出ます

ということは、Windows 上でやってますね。

while (<>) {
    print $_;
}

上記コードでいけるはず。

元の cat を使っているコードを何を見て書いたのか分かりませんが、cat は UNIX 系 OS にあるコマンドです。で、UNIX 系 OS 上で cat を使う事を考えると、質問文は

  • Perl スクリプトだとすれば、system 経由で呼び出す必要がある。
  • cat の行だけを見ると、UNIX 系 OS のコマンドラインで cat コマンドを実行しているように見えるので、であれば、シェルスクリプトの体裁に見える。ただし、先頭の $ は不必要だし、最初の行の #!/usr/bin/perl は #!/bin/sh 等に変える必要がある。

ということになります。

id:JULY

あっ、a-kuma3 の追記と被ってしまった

2013/02/24 18:28:04
  • id:taknt
    system("cat a.txt b.txt > all.txt");
  • id:takanii
    'cat' は、内部コマンドまたは外部コマンド、
    操作可能なプログラムまたはバッチ ファイルとして認識されていません。
    と出ます
  • id:a-kuma3
    >'cat' は、内部コマンドまたは外部コマンド、
    >操作可能なプログラムまたはバッチ ファイルとして認識されていません。
    あ、今度は Windows 環境ですか?
  • id:windofjuly
    うぃんど 2013/02/24 18:23:29
    MacOSXやLinuxなどはcatを標準装備
    Windowsはtypeを標準装備

    >'cat' は、内部コマンドまたは外部コマンド、
    >操作可能なプログラムまたはバッチ ファイルとして認識されていません。

    この文章構成はwindowsのものだから使うとすればtypeコマンド

    一行目の#!/usr/bin/perlはunixライクOS用のもので、
    ここ数回続いたMacOSX上の話しだとして書いているのでしょう。

    動作OSやperlのバージョンなどは必ず必須だと心得ましょう。

    後だしでポイントもらうのは気が引けるのでコメントで済ませますが、
    perlで書くなら一行だけです。

    system('type a.txt b.txt > all.txt');
    あるいは
    exec('type a.txt b.txt > all.txt');

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません