• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ファイル名変更プログラム)

ファイル名変更プログラムについての質問

a-kumaの回答

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

perl は、あんまり詳しくないのですが、分かる範囲で。 >・9~15行目の意味:おそらくファイル名の”やスペース等を外しているのかなと思うのですが・・・ そうですね。9行目は、「ブランク(タブやスペース)filename="(ダブルクォート以外の文字の羅列)" の ダブルクォート以外の文字の羅列(ファイル名と思われる文字列)を filename に代入しています。 10行目は、ファイル名がダブルクォートで括られていなかったときのためにある処理です。 14,15行目は、同様に name=なんとか ってところから、イコールの右側を切り出して name に代入しようとしています。 >・17~20行目:ここに記述した部分の前後どこにも$ctypeの定義はないので > すが、$ctypeにはなにが入っているのですか? 17行目で ctype に代入をしていますね。「Content-type: なんとか」のなんとかの 部分を切り出して ctype に代入しようとしています。 >・28~36行目:いきなり出てきた($fname,$ext2) = split(/\./,$fname); >の$ext2はなんなのでしょうか?拡張子らしい感じはするの >ですが、この35行目でどうして$ext2が拡張子として定義で >きるのでしょうか。 fname はファイル名だとすると、拡張子の前にピリオドがあると想像できます。 split() は、最後の "." の左と右のふたつに分割して、一気に fname と ext2 に 代入します(正確な用語を知りません)。 # こんな説明で、お役に立てますか? # perl は知りませんが、いっぱしの計算機屋です

saya9999
質問者

お礼

>10行目は、ファイル名がダブルクォートで括られていなかったときのために >ある処理です。 >fname はファイル名だとすると、拡張子の前にピリオドがあると想像 >できます。 >split() は、最後の "." の左と右のふたつに分割して、一気に >fname と ext2 に代入します なるほど、この辺がかなり??だったのですが、よく分かりました。 >17行目で ctype に代入をしていますね。「Content-type: なんとか」 >のなんとかの 部分を切り出して ctype に代入しようとしています。 う~ん、ここはファイルのタイプをその記述で取得できるってことなの でしょうね~。(かな?) かなり前進致しました。いつもいつも感謝致します! ありがとう、a-kumaさん!!

関連するQ&A

  • perlでファイルの拡張子を除いた文字列の取得

    perlでファイルの拡張子を除いた文字列を取得するにはどうすればいいんでしょうか? foo.txt --> foo aaa.pl --> aaa splitを使用して @array = split(/./,<filename>) $value = $array[0] としてもうまく取得できないんですが。。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • 受け取った変数がファイルに書き込めない

    Perlで質問があります。 Perlでフォームから受け取った変数の値($title = “333”)を別にCGI 投げます。Printでは問題なく変数の中身が表示されるのですが Txtに書き込もうとするとうまくいきません。 ちなみに行頭で$title = “333”;すると書き込めます。 うまく受け渡しができていないのでしょうか? 以下ソースです。 #!/usr/bin/perl -w require 'lib.pl'; #########i一応lib.plの中身######### $q = new CGI; $q->charset('EUC-JP'); print $q->header; $title = $q->param('title'); ################################## use CGI; my $fname = 'news.txt'; open(FILE, ">>$fname") or die; print FILE $title ; close(FILE);

  • ファイルの最後の行から表示させる(最新情報を5回分だけ表示)

    ファイルの最後に1行追加し、6行以上になるとファイルの先頭を1行削除。 表示は最後の行から行うスクリプトを作りたいのです。 新しい情報を5回分だけ表示する様にしたかったのですが、余りにも力技なのでもう少しスマートにやる方法を教えてもらえませんか? ----sort.txt---- 1a 2b 3c 4d ---------------- #!/usr/bin/perl $fname = "sort.txt"; print "Content-type: text/html;\n\n"; $aaa="5e"; open(OUT, ">>$fname"); flock(OUT, LOCK_EX); print OUT "$aaa\n"; flock(OUT, LOCK_NB); close(OUT); open(IN, "$fname"); $cnt = "0"; while($line = <IN>){ $a[$cnt] = "$line"; $cnt++; } close(IN); if($cnt > 5){ open(OUT, ">$fname"); flock(OUT, LOCK_EX); $cnt = "0"; while($cnt < 6){ if($cnt > 0){ print OUT "$a[$cnt]"; } $cnt++; } flock(OUT, LOCK_NB); close(OUT); } $cnt = "0"; open(OUT, "$fname"); @buff = <OUT>; close(OUT); foreach $line ( reverse @buff ){ $cnt++; print "$line<br>\n"; } exit();

    • ベストアンサー
    • Perl
  • ファイルから一行ずつ読み込むとき、@F[0] と $_ は違う?

    データファイルを一行ずつ読み込んで、文字列を一文字ずつコンマ区切りにしたいと思っています。たとえば、   xyz → x,y,z としたいと思っています。 今、data.txt に  abc  defgh という2行が書いてあります。  perl -nla -e '@chars= split(//,@F[1]); print join(",",@chars);' data.txt とすると  a,b,c  d,e,f,g,h という出力が無事に得られました。 どうせ、data.txt は一列しか使っていないので、 @F[0] の代りに $_ を使ってみました。  perl -nle '@chars= split(//, $_); print join(",",@chars);' data.txt しかし、結果は  a,b,c,  d,e,f,g,h, のように、各行の最後に余計なコンマが付いてしまいます。 なぜでしょうか? 一列しかデータがないので、@F[0] と $_ は同じだと思っていたのですが、なにか違うのでしょうか?

    • ベストアンサー
    • Perl
  • csvファイルでの,(カンマ)の取扱について

    csvファイルをperlで取扱っています。 ,(カンマ)が含まれるデータは""で括ってやれば行がずれることなく入るのは分かっているのですが、今度は取り出すときどのようにしていいのか分かりません。 各行毎に一連のデータが羅列されていますが、それの分割方法を教えてください。 たとえば、 $bに,(カンマ)入りの文字列が入っていた場合、 ($a, $b, $c) = split(/,/, $query); とすると本来$bに入って欲しいデータの,(カンマ)から後の部分が$cに格納されてしまいます。(そこから先が1つずれます) これをずれずに分割させるにはどのようにしたらいいでしょうか? ちなみに ($a, "$b", $c) = split(/,/, $query); と試しにやってみましたが、エラーになってしまいました。 実は長年の悩みで、データを格納する際に,(カンマ)を別のあり得ないような文字列に置き換えて、取り出したあと,(カンマ)に戻すというやり方でやっていたのですが、1つのデータファイルを複数のperlで取扱うようになり、対応が難しくなってきたので、これを機にきちんとした方法でデータを取扱いたいと思っています。

    • ベストアンサー
    • Perl
  • ファイルからの読みこみについて

    下記のようなdata.txtがあります。 2005/12/01,0:44:55,2.2 2005/12/01,0:45:55,7.8 2005/12/01,0:46:55,4.8 2005/12/01,0:47:55,5.5 いまこのようなプログラムがあります。(一部) $date=[]; $temp=[]; open(DATA,"data.txt"); while(<DATA>){ #一行ずつ読む if(/$name/){print "$_<BR>";} #$nameの中身を発見→出力 @field = split(/,/,); push @$date, $field[1]; push @$temp, $field[2]; } @data=($date, $temp); です。 簡単にプログラムの説明をしますとdata.txtで$name($name=2005/12/01)という文字を一行単位で検索していきます(今はすべてが当てはまります)この検索してヒットした一行の,区切りの一番右のデータを並べたものを$tempとし、,区切りの真ん中のデータを並べたものを$dateとしています。このプログラムですと$temp は [2.2,7.8,4.8,5.5]になり$dateは["0:45:55","0:45:55","0:45:55","0:45:55"]となるはずですがこのプログラムを実行すると検索結果は表示されるのですがプログラムの最後の行の@data=・・・というところが検索結果でなくdata.txtのすべてになってしまいます。どうやったら正常にもどりますか??お願いします。

    • ベストアンサー
    • CGI
  • UNIXコマンドで連番付ファイルのリネームについて

    いつもOKWaveでお世話になっております。 表題の件ですが、 UNIXのsplitコマンドで分割したファイルに拡張子を付けたく コマンドライン上で分割されたファイルを同時にリネームする方法を探しております ファイル分割 % split -a 3 -d -l 100 sample.txt sample_ ※100行単位で分割ファイルを3桁の数字で連番を付けています 処理結果 sample_000 sample_001 sample_002 sample_003 ・ ・ ・ 上記ファイルに「.txt」を付けたいと考えております 例) sample_000.txt sample_001.txt sample_002.txt sample_003.txt ・ ・ ・ 書き方の問題かと思うのですが、 renameコマンドを使いファイル名を変更しようとするも変化なしとなります % rename sample_* sample_*.txt sample_* 最終的にはコマンドをパイプで繋いで 分割からリネームまで1本の処理で完結したいと考えております。 恐れ入りますが、ご教示のほどよろしくお願いいたします。

  • WindowsでPerlをする際,1行目の"#! ~"はどのように?

    Perlの参考書・本等ではプログラムファイルの第1行目は #! /usr/local/bin/perl という1行がよく有りますが,WindowsXPを用いている場合では,この1行をどう直せばよいのでしょうか? #! (perl.exeが存在するフォルダのパス) でよいのでしょうか? 私はWindowsXPを使っていて,この1行を使わずにプログラムを書いておりましたので,この1行の意味がよく分かりません。 ある参考書には,"#!はその行に書いたコマンドに,ファイルの残りの部分を渡して実行すると言う性質を持っている"と有りました。だから,試しにfile1.plとfile2.txtを準備し, file1.plの中身  #! (perlの存在するフォルダのパス)\perl.exe  while(<STDIN>){   print;  } file2.txtの中身  hello world として,コマンドプロンプトで file1.pl < file2.txt としたのですが正しく動作しませんでした.(perl file1.pl < file2.txt と入力した場合は正しく"hello world"となりました)

    • ベストアンサー
    • Perl
  • 正規表現で絶対パス表示のファイル名からファイル名だけを削除したい

    Perlの正規表現を使って c:\xxxx\xxxx\xxxx\xxxx\abc.txt のようにファイルの絶対パスで記述されている文を c:\xxxx\xxxx\xxxx\xxxx のように ファイル名部分だけを削除して、 フォルダの絶対パスに 表示させる正規表現を教えていただけないでしょうか? ちなみにxxxxは可変値、階層の深さも決まっておらず、 ファイルの拡張子もtxt,htm,拡張子なしなどです。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • C言語での構造体の定義と初期化

    こんにちは。 C言語での構造体の定義と初期化について質問させてください。 現在、ファイル操作に関する自作ライブラリをいじっており、その中でファイルのパス名を分解する関数を作成しました。 関数自体は出来上がっており、リンクさせて動作テストをしているのですが、コンパイラが各オブジェクトをコンパイルしているときに警告が発生し、どうやっても解消しません。 gccはエラーを吐いて、コンパイルはしてもリンクしてくれません。 Bccでは警告だけで無理矢理リンクしているようですが、何故か実行ファイルが494 KB、通常の4倍以上のサイズに肥大してしまいます(コマンドラインツールなので通常は大きくても100KB程度)。 警告の原因と対処について、どなたかアドバイスをお願いします。 以下状況を簡単に説明します。 開発環境は、 PC:WinXP sp3 開発環境1:「Borland C++ compiler 5.5.1」 「MAKE Version 5.2」 開発環境2:「gcc version 3.4.5 (mingw special)」 「GNU Make version 3.79.1」 です。各環境につきMAKEFILEがあり、どちらでもコンパイルできるようにしてあります。 ヘッダファイルは長いので、全体は後で貼り付けますが、問題となっているのは多分次の部分です。 構造体のメンバとして6種類の文字配列をもち、この中にパス名やファイル名などを格納します。 struct st_split_path{ char drive [MAX_FULLPATH];//ドライブ名 char dirpath[MAX_FULLPATH];//ディレクトリパス char dir [MAX_FULLPATH];//直属のディレクトリ名 char fname [MAX_FULLPATH];//ファイル名 char fname2 [MAX_FULLPATH];//ファイル名(拡張子抜き) char ext [MAX_FULLPATH];//拡張子(ドットつき) int buffsize; } st_split_path = { {'\0'}, {'\0'}, {'\0'}, {'\0'}, {'\0'}, {'\0'}, MAX_FULLPATH, }; typedef struct st_split_path SPLIT_PATH; きちんと初期化された構造体を宣言した後、typedefで新しい型として定義しています。 初期化しないなら宣言は typedef struct SPLIT_PATH{ char drive [MAX_FULLPATH];//ドライブ名 char dirpath[MAX_FULLPATH];//ディレクトリパス char dir [MAX_FULLPATH];//直属のディレクトリ名 char fname [MAX_FULLPATH];//ファイル名 char fname2 [MAX_FULLPATH];//ファイル名(拡張子抜き) char ext [MAX_FULLPATH];//拡張子(ドットつき) int buffsize; } SPLIT_PATH; とするところですが、文字配列が6つもあるので、初期化を予めしておきたいと考えた次第です。 これで次のようなエラー(警告)が出ます。 Bcc Warning: パブリックシンボル _st_split_path がモジュール E:\WORK\FILE_CMP.OBJ と E:\WORK\LIB-FILE.OBJ の両方に定義されている gcc Lib-file.obj:Lib-file.c:(.data+0x0): multiple definition of `st_split_path' File_cmp.obj:File_cmp.c:(.data+0x0): first defined here 多分、ヘッダを取り込んだ先でそれぞれ宣言されてリンク時に名前がかち合っているのだと推察できますが、理由がよく分かりません。 これはあくまで構造体定義で、実体は呼び出し側で SPLIT_PATH sppath; として宣言していると考えています。 また、ヘッダファイル自体は多重インクルードガードをかけていますので、別のヘッダがこいつを再度取り込んでいるとは考えられません。 また、何らかの原因で実体を持っているのなら、extern 宣言で解決できると思い、 } st_split_path = { を } extern st_split_path = { ともしてみましたが状況は変わりませんでした。 私がexternを理解できていないだけかもしれませんが、他に解決策は思いつきません。 もしかして定義と初期化は同時にはできないのでしょうか。 google検索で「C言語 構造体 定義と同時に初期化」と検索しても、一応できるとは書いてあるのですが、サイトによって構造体宣言と定義が区別されてないようなサイトもあり、よく分かりません。 どなたかご教授ください。 長いのですが、次に問題があるであろうヘッダファイルの抜粋を載せておきます。 ヘッダ"Lib-file.h"の抜粋です。 問題ない構造体宣言や、雑多な関数宣言以外は、マクロ定義を含めそのままです。 #ifndef Lib_file_h //自分自身の定義 #define Lib_file_h #include "Lib-macro.h" /****************************************************************/ /**************** 環境依存につきifdef条件include ****************/ /****************************ここから****************************/ #ifdef __GNUC__ #include <sys/utime.h> #endif #ifdef _MSC_VER #include <sys/utime.h> #endif #ifdef __BORLANDC__ #include <utime.h> #endif #ifdef __INTEL_COMPILER #include <sys/utime.h> #endif /****************************ここまで****************************/ /**************** 環境依存につきifdef条件include ****************/ /****************************************************************/ #include <time.h> #include <sys/stat.h> #include <io.h> #include <fcntl.h> #define MAX_FULLPATH (255*128) struct st_split_path{ char drive [MAX_FULLPATH];//ドライブ名 char dirpath[MAX_FULLPATH];//ディレクトリパス char dir [MAX_FULLPATH];//直属のディレクトリ名 char fname [MAX_FULLPATH];//ファイル名 char fname2 [MAX_FULLPATH];//ファイル名(拡張子抜き) char ext [MAX_FULLPATH];//拡張子(ドットつき) int buffsize; } st_split_path = { {'\0'}, {'\0'}, {'\0'}, {'\0'}, {'\0'}, {'\0'}, MAX_FULLPATH, }; typedef struct st_split_path SPLIT_PATH; #ifdef __cplusplus extern "C" { #endif time_t file_mtime_get(char *fname); int split_path(char *fullpath,SPLIT_PATH *sppath); int fpath_regularization(char *fullpath); #ifdef __cplusplus }; #endif #endif