人気マンガがだれでも無料♪電子コミック読み放題!!

ActivePerlをWindowsで動かすとき、ファイルのパスを指定するのに "C:\\work\\perl"のように、フォルダとフォルダの区切りには「\\」を使います。
これを UNIX上でPerl CGIを動かすときのように「/」に換えて、"C:/work/perl"としても問題なく動いているようです。
ActivePerlで"C:/work/perl"と書くことは、問題ないのでしょうか?それとも推奨されない行為でしょうか?]

このQ&Aに関連する最新のQ&A

A 回答 (2件)

コマンドプロンプトでは \ と / を区別してますが, Windows 内部ではパスの区切としてどちらも使えます.


MS-DOS のときからず~っとそうなんだけど, 意外と知られてない.
    • good
    • 0
この回答へのお礼

なるほどそういうことだったんですか。
実は、コマンドプロンプトで "cd C:/work/perl"とやってみて動かなかったので、不安になってこの質問をしてみようと思ったのでした。
とてもよくわかりました。
ありがとうございます。

お礼日時:2008/04/04 17:02

問題ありません。


安心して使ってください :)
    • good
    • 0
この回答へのお礼

ありがとうございます。
安心しました。
"\\"を多用すると、ソースが見づらくなるので、これですっきり書けるようになります。

お礼日時:2008/04/04 17:03

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QPerlで変数を使用した置換ができない

ファイル内の「1 2 3 4 5」などの数字の箇所を、「1回 2回 3回 4回 5回」のように、「回」をつけた形に変えることを考えています。
以下のようなスクリプトを書きましたが、うまくいきません。

# 「$search_replace」の参照先のテキストファイルの内容
(\d) タブ記号 $1回


EOF

# 問題のスクリプト(一部)
chomp($search_replace);
(my $search, my $replace) = split(/\t/, $search_replace);
$string[$i+1] =~ s/$search/$replace/g; #ここが問題と思われる箇所

ほしい結果は右のとおり。「1回 2回 3回 4回 5回」
現実の結果は右のとおり。「$1回 $1回 $1回 $1回 $1回」

置換文字列の$1の部分がうまく展開(?)できないようです。
どうすればよいか、ご教示ください。

Aベストアンサー

正規表現の置換部はダブルクォート文字列と同様に評価されるので、次の2つの文は同じように機能します。質問のケースでは、変数を2重に置き換えなければならないので、明示的にダブルクォートが必要になります。

$string[$i+1] =~ s/$search/$1回/g;
$string[$i+1] =~ s/$search/"$1回"/eg;

Q複数ファイルの読み込みについて

perl初心者です。

あるディレクトリから拡張子がdataであるファイルを全て読み込みたいのですが、方法がわかりません。
cshで書くと
foreach arg (*.data)
コマンド $arg

のようになりますが、perlだと
foreach $arg (@arg){
コマンド $arg

となりますよね?
引数がリストなのでよくわかりません。
そもそもperlではできないのでしょうか?


それともう一点ですが、ファイルオープンするときに
foreachループの中で
open(FILE, "$arg");
とすることは可能ですか?
上の質問と組み合わせて全てのファイルを開いて作業を行いたいので。

説明が下手ですいません。補足しますのでよろしくお願いします。

Aベストアンサー

while(<*.data>)
{
## $_には、*.DATAなファイル名が格納されている。
open(F,"$_"); ##openする。
while(<F>)
{
##読み出された内容が$_に格納されている。
print $_; ##出力してみる。
}
}

というのが最短コーディングです。

Qディレクトリ名を取得したい

perlでディレクトリ名だけを取得したいのですが、
なかなかうまい方法が見つかりません。
ファイル名を取得する・・・というのは結構あるのですが、
ディレクトリ名だけ、というのがどうもわかりません。

ちなみにファイル名取得は以下のようにやっています。
my $md;
opendir(DIR, 'q');
while (defined($dir = readdir(DIR))) {
$md=substr($dir,0,6);
}
closedir(DIR);

ディレクトリ名だけを取得・・・というのはどうやればよいのでしょうか。

Aベストアンサー

ファイル名の取得で例示されているものは、ファイル名だけの取得できてませんよね?
質問者さんが書かれているスクリプトだと、
DIRの中にある「何か」の「たまたま」一番最後に入っていたものの「0文字目~6文字目」までを取得するスクリプトになっているのわかりますか?

my @file;
my @directory;
my $check_dir = "./q/";
$ct =0;
opendir(DIR,$check_dir);
while( defined($temp=readdir(DIR))){
#カレントディレクトリまたは上位ディレクトリの場合はパス
if( $temp eq '.' || $temp eq '..' ){ next;}
#ファイルの場合
if( -f $check_dir.$temp ){
push @file, $temp;
}
#ディレクトリの場合
if( -d $check_dir.$temp ){
push @directory, $temp;
}
}

$check_dirに設定されているディレクトリに格納されているファイルは@fileに、ディレクトリは@directoryに格納されます。

ファイル名の取得で例示されているものは、ファイル名だけの取得できてませんよね?
質問者さんが書かれているスクリプトだと、
DIRの中にある「何か」の「たまたま」一番最後に入っていたものの「0文字目~6文字目」までを取得するスクリプトになっているのわかりますか?

my @file;
my @directory;
my $check_dir = "./q/";
$ct =0;
opendir(DIR,$check_dir);
while( defined($temp=readdir(DIR))){
#カレントディレクトリまたは上位ディレクトリの場合はパス
if( $temp eq '.' || $temp eq '..' ){...続きを読む

Q現在のディレクトリパスを取得するには!?

perlにて現在のディレクトリパスを取得するにはどのようにすればいいのでしょうか?
モジュールをつかってcwd()で取得できるようなのですが、モジュールが入っていないサーバでも動くようにしたいのですがうまくできません・・・
どなたかご存知でしたら教えてください。

Aベストアンサー

if($^O eq "MSWin32"){
$cwd=`cd`;
} else {
$cwd=`pwd`;
}
print $cwd;
--------------
ぐらいでいいんじゃないでしょうか

QPerlで フォルダ内の全てのファイルを別のフォルダにコピーするには

お世話になります。
多分ご存知の方には簡単な話だと思いますが教えていただけませんか。
Aフォルダにあるhoge.txtをBフォルダにコピーしたければ
use File::Copy;
copy "./A/hoge.txt", "./B/hoge.txt" or die $!;
で出来るのはわかっているのですが、Aフォルダにある全てのファイルをBフォルダにコピーするというのはどのようなコードを書いたらよいのでしょう。
ちなみにAフォルダには100以上ファイルがあります。ファイルは全部テキストファイルです。

Aベストアンサー

$src_dir = "./a";
$dst_dir = "./b";

opendir(DIR, "$src_dir");
my @Files = grep { -f "$src_dir/$_" && /\.txt/ } readdir(DIR);
closedir DIR;

foreach my $file (@Files) {
copy ...
}

こんな感じですかね

QWindowsで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の参考書・本等ではプログラムファイルの第1行目は
#! /usr/local/bin/perl
という1行がよく有りますが,WindowsXPを用いている場合では,この1行をどう直せばよいのでしょうか?
#! (perl.exeが存在するフォルダのパス)
でよいのでしょうか?

私はWindowsXPを使っていて,この1行を使わずにプログラムを書いておりましたので,この1行の意味がよく分かりません。
ある参考書には,"#!はその行に書いたコマンドに,ファイルの残りの部分を渡して実行すると言う性質を持っている"と有りました。だから,試し...続きを読む

Aベストアンサー

ActivePerl 5.10 であれば、
 C:\foo\> file1.pl
で動くはずです。

この場合、file1.pl がなぜ Perl のプログラムだとコンピューターは知っているかというと、シェバング行(#!) は関係なくて、拡張子(.pl)と perl.exe が関連付けられているからです。
file1.pl を見るとトカゲ(ヤモリ?)のアイコンになっていると思います。
これは、拡張子 .pl が perl.exe に関連付けられている証拠です。

現在 hello world と表示されないのは、
 C:\foo\> file1.pl < file2.txt
の「<」が Windows によって正しく解釈されないのが原因です。
正しく動いていないだけで、file1.pl は動いてはいますよ。
もし動いていなかったら、エラーメッセージが出ると思います。
何も表示されていないのは、動いている証拠です。

<STDIN> の代わりに、ダイアモンド演算子 <> を使って、
 #! perl
 while(<>){
  print;
 }
みたいにして、実行は
 C:\foo\> file1.pl < file2.txt
の代わりに、
 C:\foo\> file1.pl file2.txt
とすると、予想通り hello world が表示されるはずです。
Windows は STDIN をちゃんと扱ってくれないみたいですね。
 C:\foo\> perl file1.pl < file2.txt
とすると、perl.exe が < をちゃんと処理してくれるので、予想通り動くということでしょう。

で、Windows の ActivePerl でプログラムを書く場合でも、シェバング行を書く意味はあります。

たとえば
 #! perl -w
と書くと、あぶないことをやっていると警告メッセージが出ますし、
たとえば
 #! perl -d
と書くとデバッガーが起動します。

(ただ警告メッセージを出す場合は、-w を使わないで最初に
 use warnings;
 と書く方が今風です。)

もしシェバング行をちゃんと書いていたら、UNIX サーバーに持って行ったり、Windows で UNIX 風動作を楽しむための環境 Cygwin を使う時に同じプログラムが使いまわせますし、こういう掲示板にプログラムをコピペするときもすぐに Perl のプログラムと分かってもらえます (^^)

ActivePerl 5.10 であれば、
 C:\foo\> file1.pl
で動くはずです。

この場合、file1.pl がなぜ Perl のプログラムだとコンピューターは知っているかというと、シェバング行(#!) は関係なくて、拡張子(.pl)と perl.exe が関連付けられているからです。
file1.pl を見るとトカゲ(ヤモリ?)のアイコンになっていると思います。
これは、拡張子 .pl が perl.exe に関連付けられている証拠です。

現在 hello world と表示されないのは、
 C:\foo\> file1.pl < file2.txt
の「<」が Windows によっ...続きを読む

QPerlで特定行から特定行までを抜き出したい

皆さんのお知恵をお貸し頂ければ幸いです。

Perlで以下のようなことをしたいと考えています。
例えば、次のようなテキストファイルがあったとします。

example.log
==================================
aaaa
hogehoge
test
okok
perl
script
==================================

上記ファイルを読み込んで、「hogehoge」から「perl」の間に挟まれた行だけ抜き出したいのです。
イメージとしては、読み込んだファイルを配列に入れて、一行づつ読ませ、キーワード「hogehoge」が現れたらそこでフラグを立て、それ以降の行を表示し、キーワード「perl」が現れた時点で表示を止めるという処理になるのかな?と思っています。

このような場合、どういう風にすればいいのでしょうか?
恐れ入りますが、ご教授頂ければ幸いです。

それでは、どうぞよろしくお願い致します。

Aベストアンサー

> 一行づつ読ませ、キーワード「hogehoge」が現れたらそこでフラグを立て、それ以降の行を表示し、キーワード「perl」が現れた時点で表示を止めるという処理になるのかな?と思っています。

それでいいと思いますよ?これをそのままコード化すると、こんな感じでしょうか。(No.1さんのとはちょっと結果が違います。)

open FH, "example.log" or die $!;
$flag = 0;
while ($data = <FH>) {
  chomp $data;
  if  ($data eq "hogehoge") { $flag = 1 }
  elsif ($data eq "perl")    { $flag = 0 }
  elsif ($flag) { print "$data\n" }
}
close FH;

で、もっと略したいPerlな人だとこんな感じ。Perl独特の記法がふんだんに使われているので、勉強するには不向きかもしれませんが^^;

open FH, "example.log" or die $!;
while (<FH>) {
  print if /^hogehoge$/ .. /^perl$/ and !/^(?:hogehoge|perl)$/;
}
close FH;

※インデントに全角空白を使っているので、コピーする場合はタブなどに置換して下さい。

> 一行づつ読ませ、キーワード「hogehoge」が現れたらそこでフラグを立て、それ以降の行を表示し、キーワード「perl」が現れた時点で表示を止めるという処理になるのかな?と思っています。

それでいいと思いますよ?これをそのままコード化すると、こんな感じでしょうか。(No.1さんのとはちょっと結果が違います。)

open FH, "example.log" or die $!;
$flag = 0;
while ($data = <FH>) {
  chomp $data;
  if  ($data eq "hogehoge") { $flag = 1 }
  elsif ($data eq "perl")    { $fl...続きを読む

Qperlをコマンドラインで実行したい

今はperlをコマンドプロンプト上でファイルをコンパイルして実行結果を別のテキストファイルに出力しています。(printなど)

ただ、こまごまとした置換え・変換などいちいちテキストファイルにperlを書いてコンパイルして出力ファイルを開いて取り出すというやり方にわずらわしさを感じてきました。
簡単なスクリプトであれば、使い捨ての方がよく感じており、
コマンドプロンプトで試してみたのですが、長い文章やソースなどを変数にいれることができず、(改行がEnterにとられてしまう??)また、一行にずらずらとかかなくてはならないので、うまくいきません。

なにか、テキストエディタのような感じで、このようなperlスクリプトをコンパイルできるようなものはあるのでしょうか。

copalというものを使ってみたのですが、
ファイルハンドルなどが使えなかったのでだめでした。

どなたかご協力お願いします。

Aベストアンサー

copy con tmp_0001.pl
perl tmp_myperl_0001.pl %*
del tmp_myperl_0001.pl

メモ帳等で上の3行を書いて ~.bat という名前で保存。
このファイルはパスの通っているフォルダに置く。
仮にこのファイルの名前を myperl.bat としておく。
たとえば file1.txt と file2.txtを処理したかったらコマンドラインで
myperl file1.txt file2.txt
などと打つ。
するとperlスクリプトを入力できるようになるので、好きなだけ書いたら、最後に Ctrl+Z を打って入力終了。
即座にスクリプトが実行される。

前の行を修正したりとかはできないけど、簡単なことならこれで事足りるかと。

参考URL:http://support.microsoft.com/kb/68787/ja

QPerlの変数に文字数制限(容量制限)はあるか

Perlの変数に文字数制限(容量制限)はあるか

Perlで書いた自作の掲示板なのですが、ずっと普通に動いていたのですが
急にデータが欠けてしまいました。書き込みデータはテキスト形式で、
↓の様な形で保存しています。

<div>1つの書き込みの中身</div>\n
<div>1つの書き込みの中身</div>\n
<div>1つの書き込みの中身</div>\n
<div>1つの書き込みの中身</div>\n
<div>1つの書き込みの中身</div>\n

1つの書き込みは1行に収まっていて、書き込み時に \n を付けて保存して、
読み込み時は配列に読み込んで、べろっと出すだけの処理です。
掲示板書き込みなので unshift で上が新しい書き込みにしてあります。
通常のタグ禁止処理や、改行コード処理はしてあります。Perl5.6.1です。

数日前、容量が減っていることに気付き、調べてみると、

<div>1つの書き込みの中身</div>\n
<div>1つの書き込みの中身</div>\n
<div>1つの書き

のような形でデータが欠けていました。欠けていると言っても9割方消えていました。
残っていたのは新しい側の書き込みです。
いつ消えたのか、何をした時に消えたのかが不明のため、原因を探っている段階です。

もちろん、一番怪しいのはプログラムのミスなのですが、それも調べつつ、
ちょっと前から気になっていた点として、データ容量が1.5MBぐらいまで
ふくらんでいて重くなっていたんです。
data.dat のような1ファイルにテキストばかり1.5MB、そして内部の処理でも
普通にその容量を一つの変数に入れたりしています。
データが唐突にぶつっと切れていることと、容量が多くて気になっていたこと、
この辺りでちょっと怪しいのですが、変数の容量制限、ファイルの容量制限が
調べても出てきません。知っている方いましたら教えてください。

他にも、そういうバグの時こういうミスがあったよ、など、ありましたら
アドバイスをお願いします。
自分が作った物のデバッグで恐縮なのですが、よろしくお願いします。

Perlの変数に文字数制限(容量制限)はあるか

Perlで書いた自作の掲示板なのですが、ずっと普通に動いていたのですが
急にデータが欠けてしまいました。書き込みデータはテキスト形式で、
↓の様な形で保存しています。

<div>1つの書き込みの中身</div>\n
<div>1つの書き込みの中身</div>\n
<div>1つの書き込みの中身</div>\n
<div>1つの書き込みの中身</div>\n
<div>1つの書き込みの中身</div>\n

1つの書き込みは1行に収まっていて、書き込み時に \n を付けて保存して、
読み込み時は配列に読み込んで、...続きを読む

Aベストアンサー

No.3&6です。

> flock してません・・・・・・。
> つまり、読み込み時に競合があって書き込まれたため、開いたままのデータが
> 変なところで書き込み処理に割り込まれて、おかしくなったということでしょうか。
> でしょうか、というか、その可能性があった、というところですかね?

ちょっと説明が足りなかったので補足します。

読み込み時にflock()しなかった場合ですが、書き込みが純粋に追記だけの場合は(記事表示で途中で切れることはあるかもしれませんが)データファイルの破損までは至らないかなと思います。もちろん、読み込み内容が壊れるには違いないですので、読み込みルーチンにもflock()は追加すべきです。

データファイルが壊れるケースですが、既存記事の修正機能が実装されている場合などで、読み込みルーチンで取得した@BbsDataの値を使った書き込みルーチンが別にあった場合には、たとえその書き込みでファイルロックがされていたとしてもデータファイルが壊れることになります。

もっともその場合、データ変更に関する一連のロジック自体を見直す必要があるかもしれません。
既存記事の変更を行う場合には、「一度のファイルオープン+ファイルロックの間に、読み書きを全て済ませる」という処理に置き換えないと、ほぼ同時に複数の書き込みが発生した場合に一部のデータが失われるという別の不具合が発生する恐れがあります。ご参考まで。

No.3&6です。

> flock してません・・・・・・。
> つまり、読み込み時に競合があって書き込まれたため、開いたままのデータが
> 変なところで書き込み処理に割り込まれて、おかしくなったということでしょうか。
> でしょうか、というか、その可能性があった、というところですかね?

ちょっと説明が足りなかったので補足します。

読み込み時にflock()しなかった場合ですが、書き込みが純粋に追記だけの場合は(記事表示で途中で切れることはあるかもしれませんが)データファイルの破損までは至らないかなと...続きを読む

Qディレクトリのファイル数取得

あるディレクトリのファイル数の取得しその数を「ファイルは○個あります」と表示したいのですが。拡張子jpgのファイル数だけを取得したいです。

Aベストアンサー

さっきの続きでいくなら、

## 以下一行追加 変数のを初期化。以下、jpgファイルを見つけるたびにカウントを増やすようにする。
$i = 0;
while ($current_file = readdir(DIR)) {
if (substr($current_file,-4,4) eq "\.jpg") {
## 以下一行追加 ここに来るということはファイルが有ったという事なので1つカンターを増やす。
$i++;
:
中略
:
} elsif ( $current_file !~ /[\.]+/ && stat($current_file) && -d _ ) { # ., .. は除く。 statして directoryかどうかチェックする
:
中略
:
}
}
closedir(DIR);

## 以下一行追加 書式は適宜必要に応じて記述変更するのが吉。
print "<TD ALIGN=RIGHT>ファイルは $i個あります\n";
print "</TABLE>\n";
exit:

さっきの続きでいくなら、

## 以下一行追加 変数のを初期化。以下、jpgファイルを見つけるたびにカウントを増やすようにする。
$i = 0;
while ($current_file = readdir(DIR)) {
if (substr($current_file,-4,4) eq "\.jpg") {
## 以下一行追加 ここに来るということはファイルが有ったという事なので1つカンターを増やす。
$i++;
:
中略
:
} elsif ( $current_file !~ /[\.]+/ && stat($current_file) && -d _ ) { # ., .. は除く。 statして directoryかどうかチェックする
:
中略
:
}
...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング