人に聞けない痔の悩み、これでスッキリ >>

Perlであるプログラムを起動するスクリプトを作成しようとしているんですが、Windowsで"C:\Program Files\..."のように空白を含む場合、うまくいきません。
最初にchdirで移動しようとしてもchdirもうまく動かないのですが、どうしたらいいでしょうか?

$Path = C:\program files\Module Home 6.2.1\Server\bin

chdir ($Path);
$cmd = "aaa.exe $user $port > $Logfile";
ret = system($cmd);

exit;

A 回答 (3件)

ん~, 手元だと


$dir = "c:/Program Files";
chdir($dir);
system("dir");
でちゃんと c:\Program Files のファイルリストが表示できるんだけど....
    • good
    • 0

""で囲む、


\は\\にするとかしてみたらどうですか
    • good
    • 0

$Path = '相対パス';



で動作した。

この回答への補足

回答ありがとうございます。相対パスだと動作しますね。
本文には記述しなかったのですが、
将来プロパティファイルにてパスを管理して、ソースはさわらないようにしようと考えています。
そのときに相対パスでは管理しづらいかなと思いますので、できれば絶対パスにしたいと思っています。

補足日時:2005/09/08 15:52
    • good
    • 0

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

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

Qperl system関数 引数 フォルダ

perlのsystem関数を使って、コマンドを実行したいのですが、
実行ファイルの引数にフォルダを指定すると、うまく動作しません。

以下のように書いています
system "実行ファイル フォルダ";

実行ファイルは .BATファイルで、
指定しているフォルダには複数のテキストファイルが入っています。
perlで書いたcgiファイルは実行ファイルと同じディレクトリにあります。
コマンドからではなく、手動でドラッグ&ドロップすると正常に動作します。
windous7でperlはActivePerlを使用しています。


引数にはフォルダを指定できないのでしょうか?
またフォルダを指定できない場合、解決策などはあるのでしょうか?

よろしくおねがいいたします。

Aベストアンサー

> しかしブラウザに
(略)
> が表示されてしまいます。

それは、バッチファイルが出力したものでしょう。
バッチファイルが出力したものも、CGIの出力に混ざってしまいます。
Perl側で対応する場合は、
system '… > nul'
としてください。
あるいは、バッチファイル側で、1行目に
@echo off
という行を追加してもいけるかと思います。

Qセルを右クリックしたときにハイパーリンクが表示されない

エクセル2003を使っていますが、任意のセルを右クリックしたときに「ハイパーリンク」のメニュー?が表示されません。(他の人のパソコンでは表示される)
「ハイパーリンク」のメニューを表示させるような設定があるのでしょうか?お教えください。

Aベストアンサー

自分も同じ問題でした。

「改ページプレビュー」で表示している事が原因です。
表示を「標準」にするとハイパーリンク表示がでます。

Q文字コードの変換(Shift-JISからUTF8)

文字コードがShift-JISのCSVファイルを読み込み、UTF-8のテキストファイルに出力するのに
プログラムの中で変更しようとしているのですが、うまくいきません。出力ファイルの文字コードを
確認するとShift-JISのままです。
どなたか教えていただけないでしょうか?
ActivePerl v5.16.0を使用し、Encodeモジュールのfrom_toを使用しています。

#!/usr/bin/perl

use strict;
use warnings;

use utf8;
use Encode;

my $input_file="input.csv";
my $output_file="output.txt";
open (IN, $input_file) or die "$!";
open (OUT, ">$output_file") or die "$!";

while (<IN>){
chomp ($_);
my @data=split(/,/,$_);

for(my $i=0;$i<@data;$i++){
$data[$i]=Encode::from_to($data[$i],'shiftjis','utf8'); #Shift-JISからUTF-8に変換
$data[$i]=~s/\s+//g;
print OUT $_;
}
print OUT "\n";
}
close (IN);
close (OUT);

文字コードがShift-JISのCSVファイルを読み込み、UTF-8のテキストファイルに出力するのに
プログラムの中で変更しようとしているのですが、うまくいきません。出力ファイルの文字コードを
確認するとShift-JISのままです。
どなたか教えていただけないでしょうか?
ActivePerl v5.16.0を使用し、Encodeモジュールのfrom_toを使用しています。

#!/usr/bin/perl

use strict;
use warnings;

use utf8;
use Encode;

my $input_file="input.csv";
my $output_file="output.txt";
open (IN, $input_file) or die "$!...続きを読む

Aベストアンサー

あの、私のや他の回答をよく読んで考えてください。


for(my $i=0;$i<@data;$i++){
$data[$i]=Encode::from_to($data[$i],'shiftjis','utf8'); #Shift-JISからUTF-8に変換
$data[$i]=~s/\s+//g;
print OUT $_;
}

この部分は **** $_には何の影響も与えません ****
よって、** 出力に関することだけに注目したら **

for(my $i=0;$i<@data;$i++){
print OUT $_;
}

これと等価です。どこで「Shift_JIS からUTF-8へ変換」してますか?
$_は「while (<IN>){」の<IN>で1行読み込まれ、「chomp ($_);」で末尾の改行コードが削除されただけで、移行なにも変化していません。コードは入力のまま=Shift_JISです。それをそのまま出力すればShift_JISになるのが正解です。
しかも、項目数分だけ繰り返し出力されます。
(重複行になる、と#1に書いたのはchompのことを失念していた私のミスです)

@dataを変更したのなら、出力するのは@dataでしょう。
join(",", @data)とすれば、項目をカンマ区切りの文字列にすることができます。


あと#2にあったfrom_toの使い方。マニュアルをよく読みましょう
http://perldoc.perl.org/Encode.html#[$length-=]-from_to($octets,-FROM_ENC,-TO_ENC-[,-CHECK])
・$octetsを直接変換する
・$octetsの長さを返す
とあります。つまり
$data[$i]=Encode::from_to($data[$i],'shiftjis','utf8')
だと,$data[$i]には元の内容は破棄されて、文字列の長さになってしまいます。



各項目毎に処理したい、という意図はわかりました。

ですが、文字コードの変換が項目毎に違うなんてことはまず無いでしょう。
それならば、$_で1行をコード変換→splitして項目毎の処理、としてもいいのでは?

ついでにPerlIOを使って
open (IN, "<:encoding(shift_jis)", $input_file) or die "$!";
open (OUT, ">:utf8", $output_file) or die "$!";
とでもやれば、プログラム中はコードをあまり意識せずに文字列処理ができます。

あの、私のや他の回答をよく読んで考えてください。


for(my $i=0;$i<@data;$i++){
$data[$i]=Encode::from_to($data[$i],'shiftjis','utf8'); #Shift-JISからUTF-8に変換
$data[$i]=~s/\s+//g;
print OUT $_;
}

この部分は **** $_には何の影響も与えません ****
よって、** 出力に関することだけに注目したら **

for(my $i=0;$i<@data;$i++){
print OUT $_;
}

これと等価です。どこで「Shift_JIS からUTF-8へ変換」してますか?
$_は「while (<IN>){」の<IN>で1行読み込まれ、「chomp ($_);」で末尾の改行コ...続きを読む

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;

Qperl 初めてのプログラムにエラーが出ます

hello.pl
というファイルに

print “hello”;
と、書きました。

ターミナルに
perl -cw hello.pl
と、入力しました。

Unrecognized character \xE2; marked by <-- HERE after print <-- HERE near column 7 at hello.pl line 1.
と、メッセージが出ました。

解決方法を教えて頂きたいです。
よろしくお願いします。

Aベストアンサー

printの直後、スペースのつもりで、全角空白を書いちゃってますね。


人気Q&Aランキング