• 締切済み

perl ファイルが開かない

perl でファイルを開きたいのですが、なぜか開けません。何がいけないのでしょうか?エラーは、 Name "main::file" used only once: possible typo とでます。エラーを見るかぎり、コードに間違いはなく、apacheかOSに何か原因があるのではないかとおもうのですが、悩んでいます。OSはubuntuです。 #!/usr/bin/perl -w open (IN, "<test.txt") or die ("Could not open $file: $!"); while(<IN>) { print "$_"; } close (IN);

  • Perl
  • 回答数3
  • ありがとう数3

みんなの回答

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

> エラーを見るかぎり、コードに間違いはなく、apacheかOSに何か原因があるのではないかとおもうのですが その認識が間違いです。明らかにコードの間違い(あるいは、間違いが疑われる)ものです。 > "Could not open $file: $!" とありますが、このスクリプトのどこにも $file なる変数が定義や代入された形跡がありません。 Perlとしては、 未定義値→文字列としては空文字列なので Could not open : .... 等と表示されるでしょうが、これがプログラマの望んだ動作なのか、 Could not open file : .... と表示させたいのか($が余分) Could not open $file : .... と表示させたいのか($に\を付けてエスケープする) $file="test.txt" などとして < open (IN, "<", $filetest.txt") or die ("Could not open $file: $!"); として、エラーメッセージを Could not open test.txt : .... としたいのか、がわかりません。 なので 「typo(=打ち間違い)ではないですか?」と警告を出しているものです。 どのケースかによって、それにあった対処をしてください(あるいは、ここに無いことが目的かもしれませんが) 言語としての手軽さが犠牲になりますが、このような「使ってない変数やリストを使ってしまう」のを防ぐために、 use strict ; して使う変数はmy 等で宣言する、ということも必要です。特に大規模なスクリプトになる場合は

MASA0901
質問者

お礼

ご回答ありがとうございます。原因はどうやら環境変数の指定をして、パスを通してやることだったみたいです。 >言語としての手軽さが犠牲になりますが、このような「使ってない変数やリストを使ってしまう」のを防ぐために、 use >strict ; して使う変数はmy 等で宣言する、ということも必要です。特に大規模なスクリプトになる場合は につて、もっと勉強しておきます。

回答No.2

変数 $file が定義されていないからです。 #!/usr/bin/perl -w my $file;  ←追加 open (IN, "<test.txt") or die ("Could not open $file: $!"); while(<IN>) { print "$_"; } close (IN); ではどうでしょうか。 ↓こちらを読む事をお勧めします。 http://www.geocities.jp/ky_webid/perl5/005.html

MASA0901
質問者

お礼

ファイルを指定していないことも間違いでしたが、環境変数に原因があるということが分かりました。 ご回答ありがとうございます。

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.1

#!/usr/bin/perl -w open my $fh, "<", "test.txt" or die "$!"; while(<$fh>) { print $_; } close ($fh);

関連するQ&A

  • Perlでのファイル入出力、処理方法

    メモ帳で以下のようなプログラムを書きました。(file_1.plで保存しました) #!/usr/bin/perl $file="data.csv"; $cityfile="name.txt"; $outfile="data_out.csv"; open (IN, $file) or die "$!"; open (FILE, $file) or die "$!"; open (OUT, ">$outfile") or die "$!"; @city = <FILE>; ・ ・ ・ これをCygwinコマンド上で、 perl file_1.pl と入力し、Enterを押すと「No such file or directory at file_1.pl line 9.」と表示されます。 line9はopen (FILE, $file) or die "$!";という文です。 どこが間違えで、どのように修正すればよいのでしょうか。 よろしくお願いします。

  • Perlでテキストファイル読み込み

    基本的な質問ですみません。 サーバ上のテキストファイルを読み込んで ローカルのテキストファイルに書き込むというだけなのですが 何度やってもできません。 以下プログラムですが #!usr/bin/perl open(IN,"http://*****/***/***.txt"); $file = <IN>; close(IN); open(OUT,"> a.txt"); print(OUT "$file"); close(OUT); サーバのアドレスは、URLうってみて見れたのでhttp://***(以下略)であってると思います。 サーバのテキストにはchmodで777と権限を与えました。 プログラムに問題あるのでしょうか。 この場合考えられる原因を教えてください。

    • ベストアンサー
    • Perl
  • Perl 教えてください。

    下記のような簡単なスクリプトなんですが、なぜかサーバーにアップすると動きません。 ローカルでコマンドプロンプトから直接実行するとまともに動作します。 パーミッションは「755」と「705」でやってみましたが。 perlのパスは合っていますし、実際同じ場所に置いた他のCGIは動作します。 #!/usr/bin/perl open (DT, "<./data/***/***.csv") or die "File '***.csv' Open Error."; @data = <DT>; $data[0] = ",,,,,,\n"; open (OUT,">./data/***/***1.csv") or die "File '***1.csv' Open Error."; print OUT @data; close (DT); close (OUT); 原因が分からず困っています。 解決策でなく、原因と思えるだけの回答で結構ですので何卒よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • windows環境でのperlのパス

    以下の環境で開発をしています。 OS: windows XP ActivePerl 5.8.8 apache 2.0.64 レンタルサーバで利用しやすいようにperlスクリプトの第1行目に #!/usr/bin/perl を記述していますが、ActivePerl のありどころが C:\dev\perl\bin\なので第1行目を #!/dev/perl/bin/perl  にしなければなりません。 #!/usr/bin/perlの記述をそのまま使う為に巷でよく言われているようなwindowsのジャンクション機能を利用しています。 Cドライブ直下に「usr」ホルダを作り、ここにC:\dev\perl\bin\のジャンクションを設定しました。 するとC:\usr\を覗くとbin\が存在します。つまりC:\dev\perl\bin\はC:\usr\bin\でアクセスできるようになります。 しかしこの状態で#!/usr/bin/perlの記述をそのまま使うと500エラーが出ます。 これ以外に何か良い方法はございませんでしょうか? また同じような開発環境の皆様はperlスクリプトの第1行目をどのように対策されていますでしょうか? 宜しく御教授お願いいたします。

    • ベストアンサー
    • Perl
  • ドットを含まないファイルの表示

    ドットを含まないファイルをperlで表示したいのですが、 うまくいきません。 シェル上から「ls | grep -v "\."」を実行すれば、 意図した結果は得られています。 しかし、perl上で動作させると、何も表示されません。 #! /usr/bin/perl chdir("/tmp"); open(DIR_IN, "ls -l | grep -v '\.' 2> /dev/null |"); while($file=<DIR_IN>) { print $file; }

    • ベストアンサー
    • Perl
  • perl ファイルのデータを編集したい

    初めまして、perl をやり初めたばかりです。作業は Linux 上で行ってます。 あるテキストファイル data.txt があります。 data.txt の中は、以下のようになっているとします。 100 200 300 400 500 600 これを読み込んで、例えば、 1 2 3 4 5 6 以上の様に各数字を百分の一にして出力したいと思ってます。 一応、色々と調べながらプログラムを書いてはみましたが 思う様に出力されません。以下そのプログラム。 #!/usr/bin/perl open(IN, "data.txt") or die ; @x = <IN>; close (IN); $ref_x = \@x; $n_data = @x; for ($i = 0; $i< $n_data; ++$i) { $$ref_x[$i] /= 100 ; print $x[$i], " "; } print"\n"; どなたか、perl にお詳しい方教えていただけないでしょうか? 宜しくお願い申し上げます。

  • Perlをcshスクリプトに書きなおしたい

    以下のPerlで書かれたCGIをcshスクリプトに書き直したく思っています。 #!/usr/local/bin/perl # load libraries require ("/usr/local/bin/cgi-lib.pl"); # cancel stdout buffering $| = 1; # header response print "Content-type: text/html\n\n"; print STDOUT "<HTML><HEAD></HEAD><BODY>\n"; &ReadParse; open(COMM, "|./message > ./message.out") || die; $in_text = $in{"Name"}; print COMM "Name: $in_text\n"; ... "Name"という変数名で受け取った文字列を$in_textに代入している ようですが、この辺りの処理、cshではどう書けばよいのでしょうか。

    • ベストアンサー
    • CGI
  • Perlのファイルのアップロードの方法についてお聞きします。

    Perlのファイルのアップロードの方法についてお聞きします。 &ReadParseを用いた方法で、 $file = $in{'TENSOU'};で$file自体にデータが入るので 簡単だなと思っていましたが、送信元と送信後のファイルが若干違っていました。 使い方が間違っているのでしょうか? 以下、サンプル ◆HTML側 <FORM ACTION="up.cgi" ENCTYPE="multipart/form-data" METHOD="POST"><P> ファイル: <INPUT TYPE="file" NAME="TENSOU" SIZE="32"><BR> <INPUT TYPE="submit" VALUE="送信"> </FORM> ◆Perl側 &ReadParseの例を用いた方法 #!/perl/bin/perl #!/usr/local/bin/perl use CGI; use CGI::Carp qw(fatalsToBrowser); #--->エラー対策 require 'cgi-lib.pl'; require 'jcode.pl'; $BUFSIZE = 2048; &ReadParse; # ==> 強力な変換 $file = $in{'TENSOU'}; # ==> 実態自体がデータなので、取り扱いしやすい $file_size = length($file); $file_size *= ($BUFSIZE / 1024); open(OUT, "> test.jpg"); print(OUT $file); close(OUT); print "Content-type: text/html\n\n"; print "$file_size(KB)<br>\n"; print "<a href=\"test.jpg\">テスト</a>\n"; exit;

    • ベストアンサー
    • CGI
  • perl 計算結果をファイルへ出力したい

    perl やり始めたばかりです。宜しくお願いします。 入力ファイル data.txt があるとします。 data.txt は、 123 456 789 333 555 777 以上のようなテキストファイルといたします。このファイルを 以下の様に100分の1にして出力したい。 1.23 4.56 7.89 3.33 5.55 7.77 と言うことで、この場で教えていただきました。それが、以下です。 #!/usr/bin/perl open(IN, "data.txt") or die ; @x = <IN>; close (IN); foreach $line (@x){ chomp($line); @elms = split(' ',$line); foreach $data (@elms){ print $data/100," "; } print "\n"; } おかげ様でこれはこれで上手く動きました。そこで、出力値をファイルに 書き込みたいのです。 もちろん、以下の様な方法でファイルに 書き込めるのは判っております。 計算プログラム.pl > outfile.txt しかし、上のプログラムをベースにファイルに書き込めないかと色々と 試してはみましたが、どうも上手く行きません。 どなたか教えて頂けないでしょうか? 宜しくお願い申し上げます。

    • ベストアンサー
    • Perl
  • Perl出力をUTF-8に指定する方法

    Perlの出力を UTF-8にするため、 binmode FILE, ':utf8'; を指定したり、 open (FILE, ">:encoding(UTF-8)","$file" ) || die "Error opening $file: $!"; でopenしてみたりしたのですが、それぞれ unknown discipline ':utf8' unknown open() mode: というエラーが出てしまいます。Perlは v.5.6.1でWindows XP(英語版)ですが、UTF-8を指定することはできないのでしょうか?

    • ベストアンサー
    • Perl

専門家に質問してみよう