こんにちは。Perl(超?)初心者です。
フォルダ内にあるファイルの名前を、「filename_ja.txt」という形式から「filename_en.txt」に変更するスクリプトを書こうとしているのですが、エラーになってうまくいきません。
環境は、Windows XP professional SP3とActivePerl 5.10 で、以下のように記述しました。
use strict;
use warnings;
my @filename = glob "*.txt";
foreach my $oldname(@filename) {
my $newname = $oldname;
$newname = ~s/(.+)_ja\.txt/$1_en\.txt/;
rename ($oldname,$newname);
}
これを実行すると、「Use of uninitialized value $_ in substitution (s///) at test_5.pl line 8.」とエラーメッセージが出て、フォルダ内のテキストファイルが消失してしまいます。
また、以下のようにも書いてみたのですが、やはりうまくいきません。
この場合は、エラーこそ出ないものの、なにも起こりません。
use strict;
use warnings;
for(<\.txt>) {
my $old=$_;
s/(.+)_ja\.txt/$1_en\.txt/;
rename($old,$_);
}
初歩的な質問で申し訳ありませんが、ダメな生徒にアドヴァイスを与えるつもりで、スクリプトを添削していただけるとありがたいです。
よろしくお願いします。
No.1ベストアンサー
- 回答日時:
$1_en\.txt を、 ${1}_en\.txt に代えたらどうでしょう?
一般的に、 "" や m// の様な変数と文字列を混在して書ける所では、変数名の終りを意識せずに書くと後続の文字列も含めて変数名と解釈される場合があります。 そのときは、上記の様に変数名を {} で囲みましょう。
ところで...
> $newname = ~s/(.+)_ja\.txt/$1_en\.txt/;
= と ~ の間に空白は、本当は無いんですよね?
「=~」はひとつの演算子で、途中の空白は無い方が良いです。 「=~」の前後には、空白がある方が良いです。
ところで その2
$newname =~ s/_ja\.txt$/_en\.txt/;
の方が良いと思いますよ。
早速のご回答ありがとうございました。
ご指摘のとおり、= と ~ の間にスペースがあり、ついでに =~ の後ろにスペースがありませんでした。ここを直したら、意図したとおりに動きました。
ところで、ファイル名を変更したいファイルは「en」というファルダに入っているのですが、このフォルダ名を引っ張ってきて、「_ja.txt」を「_en.txt」にすることは初心者にも可能でしょうか。
というのも、C:\foldername\en、C:\foldername\de、C:\foldername\frという3つのフォルダに大量のファイルが格納されていて、それぞれ「en」フォルダのファイルは「_en.text」に、「de」は「_de.txt」に、「fr」は「_fr.txt」にファイル名を変更する必要があるのです。
これを処理するスクリプトは、初心者にはハードルが高すぎるでしょうか。
想像するに、C:\foldername 以下のディレクトリ名を取得して、そこから最後の2文字を切り出して、それを配列やら変数やらに代入してなどなど、難しそうな作業が満載のような気がします。
No.3
- 回答日時:
条件の後出しは(スクリプト書く上で)非常に嫌われるので、最初に出来る限り出しておいたほうがいいですよ。
use strict;
use warnings;
use File::Copy;
my $dir = "C:/foldername";
my @langs = qw/en de fr/;
foreach my $lang (@langs) {
while (my $file = glob "$dir/$lang/*.txt") {
my $rename = $file;
$rename =~ s/_jp\.txt$/_$lang.txt/;
move ($file, $rename);
}
}
No.2
- 回答日時:
> 初心者にも可能でしょうか。
やりたい事がもっと詳細かつ具体的に分らないと何とも言えませんね。 Perl初心者というよりプログラミング初心者ならなおさらです。
・C:\foldername は例なんでしょうが、1個だけか沢山あるのか?
・対象ファイルは、C:\foldername/*/ 直下のみかサブディレクトリ下にもあるのか?
まずは、 glob に絶対パスを渡して簡単になりませんか?
glob "C:/foldername/en/*_ja.txt"
とか
glob "C:/foldername/*/*_ja.txt"
ご助言ありがとうございます。
glob に絶対パスを渡すこともできるのですね。
それなら、
my @filename = glob "C:/foldername/en/*_ja.txt"
<ファイル名変更の処理>
my @filename = glob "C:/foldername/de/*_ja.txt"
<ファイル名変更の処理>
my @filename = glob "C:/foldername/fr/*_ja.txt"
<ファイル名変更の処理>
のように、重ねていけばいけそうな気がします。
土臭いやり方ですけど。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2023/02/03 13:18
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Excel(エクセル) エクセルのマクロについて教えてください。 2 2023/02/04 12:47
- Visual Basic(VBA) VBAでエクセルをtxtに変換するとエクセルでカンマを含む文字数字がtxtでは「""」付にならないよ 1 2022/08/27 12:17
- その他(プログラミング・Web制作) ファイル名の一部をbatで変更したい batファイルを使って、以下のようにファイル名の一部を変更した 3 2023/02/21 20:09
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/08/09 10:33
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/02/05 09:55
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テキストファイルで提出とは?
-
ターミナルで特定の文字と文字...
-
Perlでの文字列置換
-
#!/usr/bin/perlで書きだしたCG...
-
Perlのエラーについてご教授く...
-
perlのflock関数でロックをかけ...
-
ファイルアイコンの左下に緑の□...
-
perlプログラミング 空白行削除
-
perlのrequireの動き方について...
-
ペプシコーラとコカ・コーラとD...
-
perlについての質問
-
perl このテキストファイルを簡...
-
Perlでファイルの末尾から指定...
-
Perlで特定文字列から特定文字...
-
Perlのプログラムについて
-
CGIでimgタグでalignを使うとエ...
-
openした後、closeしないでプロ...
-
perl 初等プログラミングについて
-
Windows版のPerlについて
-
このファイルを開く方法で困っ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
INDIRECT 横に再度抽出したい
-
perlをバージョンアップしたら...
-
openした後、closeしないでプロ...
-
Perlで特定文字列から特定文字...
-
Wallpaper Engineでおすすめの...
-
Perlのエラーについてご教授く...
-
アルファベットに付いて質問し...
-
Strawberry Perl for Windows ...
-
bashスクリプト
-
テキストファイルで提出とは?
-
Perl の外部モジュールの利用方法
-
#!/usr/bin/perlで書きだしたCG...
-
Windows10においての『Perl』の...
-
perlのflock関数でロックをかけ...
-
perlで2次元配列をサブルーチ...
-
Perlで時間の計算
-
perlのrequireの動き方について...
-
画像が表示でnull; this.src
-
ターミナルで特定の文字と文字...
-
英数文字列のうちの数値を4桁に...
おすすめ情報