Perlについての質問箱 9箱目

このエントリーをはてなブックマークに追加
忠実に訳してもらえば原語の想像はしやすいが、こなれた訳だと全然想像できなくなるので、
難しい問題ではある。一つの語を全然別の語に訳しなおすとか。
>>938
存在するならば、コンピュータ書籍を翻訳できる翻訳家を列挙してくれ。
「リファクタリング」の訳はまともじゃないかな。
946デフォルトの名無しさん:04/05/22 15:49
パスの通っていないところにある perlのファイルを全く違うところから
相対パスなどで実行するとき、

$ ../../tools/mytool.pl foo.txt

そのperlファイルが自分と同じディレクトリにあるライブラリをrequireで
呼んでいる場合、下のように実行パスを調べて付加してやらないと
カレントを探してないといわれていまいます。

#/usr/bin/perl
#mytool.pl
if ($0 =~ /^(.*\/).*$/) { $epath = $1; } else { $epath = './'; }
require $epath .'mylib.pl';

なにかもっといい方法があるのでしょうか?
my $path=$0; $path=~s/[^\/\\]+$//; require $path.'mylib.pl';
Win の ActivePerl 5.8.3 で日本語を使おうと思ったら、なんかすごく訳わかんないんですけど・・・
use utf8 とか use encoding 'shiftjis' して、
-f に utf8 で全角を含む文字列を渡すと結果が間違いとか。(多分このせいで File::Find がおかしくなるとか)
system ('echo OKあ'); の結果が予想したようにならないとか。
なんか設定があるのかと思って探しましたが、見つかりませんでした。

(元が Unix のツールだから、システムコールで unicode は考えてないのかと思いましたが、
open は大丈夫なのでちょっと不思議だなあ、と)


use utf8 とか use encoding 'shiftjis' しないと、SJIS でスクリプト書くの大変ですし。

みなさんスクリプトやデータに日本語(SJIS)使いたい時、どうしてます?

use encoding や use utf8 しないで、EUC でスクリプト書いて、I/O を jcode などで自分で変換するのが
一番確実な気がしてきました。(特に unicode を使いたい訳でもないので)
が、そんなもんなんでしょうか?

今書いてる奴は実行環境の問題で jperl は使えないし。
>>948
こんなのは。
use encoding 'shift_jis';
use Encode;
sub en{
    encode('shift_jis',$_[0]);
}
sub de{
    return decode('shift_jis',$_[0]);
}

my $path='c:\test';
opendir(my $dir,en $path);
my @files=grep {$_ ne '.' && $_ ne '..'} map {de $_} readdir($dir);
closedir($dir);
たぶんファイルの文字コードを指定できるように、
ファイル名の文字コードやコマンド引数の文字コードを
指定しとくとunicode文字列を適当に変換してくれる
ような仕組みも必要なんだろうね。いちいち自分で変換
するなんてめんどくさくてやってられん。
951949:04/05/23 00:41
追記
Win32::OLEとかを使う時などは結構役に立つと思う。
myopendirとか作ってラップするという手もあるけど、この手法なら非標準の出力先・入力元(Win32::OLEなど)でも使えるので。
ただし入出力するものにde en とつける必要があるが(ただdecodeとかそのまま使うよりは楽)
system (en 'echo OKあ');
>>950
読み込んだり書き出したりする時に文字コード変換する仕組みはあったと思うぞ。
my $sjisfile='sjisfile.txt';
my $utf8file='utf8.txt';
my $eucfile='euc.txt';
open my $in,  "<:encoding(shiftjis)", $sjisfile or die;
open my $out, ">:encoding(utf8)",   $outfile or die;
open my $out2, ">:encoding(euc-jp)",   $outfile or die;
while(<$in>){print $out $_;print $out2 $_}
close($in);
close($out);
close($out2);
ファイル名とか、システムコール/APIに渡す文字列をエンコード/デコードする仕組みがどうって話しじゃないの?

ストリーム中のデータはPerlIOが処理してるれるけど、それじゃなくて。
953948:04/05/23 23:42
私もとりあえず自分で SJIS 変換してごまかしたんですけど、
それだと結局、ファイル名に SJIS にない Unicode 文字使われた時に File::Find::find が
おかしくなるとか、結構ツライんですよね。

個人的にはいらないんですけど、Win だと意識せずにファイル名に使ってる人とかいるんで。

open のファイル名では使えたような気がしたんですけど、今ためしたらダメでした。

なるほど、現時点の Perl では、ストリームI/O でしか Unicode を意識してないって事ですか?
それならそれで判断しやすいんで、当面は自分でコード変換しますけど・・・。

そもそも Win 版は ANSI 版の API しか使ってないのかな。
最近 Win では ActivePerl しか使ってないけど、本体を自分でビルドしたら変わるかもしれないですね。
ヒマできたら調べてみよ・・・
954948:04/05/23 23:49
そういえば、find については、普通の SJIS 文字でもおかしくなった事がある気がします。
別の原因だったかもしれないですけど。
955948:04/05/23 23:52
たびたびスンマソン。
私の勝手な思いとしては、変換というよりは、システムコールが Unicode 対応なら
そのまま渡すと思っていたんですが、結局はそうじゃないんですね?
Perl自体がUnicode対応でも、モジュールが全てそうだというワケではないよ
File::Findについては調べてないけど
957325:04/05/24 10:54
>>938
オライリーの本、そんなにわかりにくいとは思わないけど。。。
オブジェクト指向perl勉強しようと思ってマスターコース読んだけど、
イマイチしっくりこず、「実用perlプログラミング」読んで目から鱗でした。
958教えてモンゴメリー伯爵:04/05/25 01:24
たとえばだ CSV形式のデータ 1,2,3,4,
               a,b,c,d
              あ,い,う,え
というデータがあるとしよう。
これをだな
              1,a,あ
              2,b,い
3,c,う

というふうにしたいわけだが....
どうしたらいいのじゃ

959教えてモンゴメリー伯爵:04/05/25 01:27
明日またくるからなー
>>958
@csvData1 = split (/,/, $csv1);
@csvData2 = split (/,/, $csv2);
@csvData3 = split (/,/, $csv3);

for ($i=0; $csvData1[$i]; $i++) {
$newData = join (',', ($csvData[$i], $csvData[$i], $csvData[$i]));
push @newCsvData, $newData;
}

実際動かして試してないから、わからんが、
これで行けんだろ。
眠いから寝る。
>>960
間違えた。
>$newData = join (',', ($csvData[$i], $csvData[$i], $csvData[$i]));

ここの所。
$newData = join(',', ($csvData1[$i], $csvData2[$i], $csvData3[$i]));
へ変更。
このスレのやつらはどんなエディタつかってんだ?


スレ違い?
大昔 WordStar
昔  Vz
今  Meadow
emacs cperl-mode
965デフォルトの名無しさん:04/05/25 10:13
サクラエディタ
Jedit
vi
って、なんか上の方にも似たような話なかったか
別に埋め立てるためだからって
手垢のついた話題、無理に持ち込まなくてもいいぞ
> aaa.pl *.txt
と指定したとき、ファイル名の大文字・小文字の違いを無視して
ファイルを読み込ませる方法ってありますか?
>>969
意味ふめー

> aaa.pl *.txt
でどうになって欲しいの? (どこがまずいの?)
拡張子が、txt、TXT、Txtみたいに大文字小文字がバラバラでも、
*.txtって指定したら全部対象になるようにしたい。

元々がDOS使いの人間で、ファイル名の大文字小文字の違いを意識してなかった。
おかげで、*.txtって指定して、*.TXTが処理してなかったというテイタラクをしてしまった…
>>971
シェルが処理すべき問題で、Perlが処理すべき問題じゃない
readdir()とかと正規表現使えば出来ない事は無いけどな
while(<*.{txt,TXT}>){print "$_\n"} じゃだめか?カッコ悪いかそうか。
>>971
aaa.pl *.[tT][xX][tT]
>>973
カッコ悪くはないです。

拡張子といっても、3文字だけでも大文字小文字の組み合わせで8種類あるし、
txt、htm、doc、cntなど色々とあるので、もう少し流用しやすい方が嬉しい。

まぁ、txTなんて拡張子をつける人なんて考えられないけど、人のやることだし…

>>974
こんな手があるとは…
ってことは、973の {txt,TXT} を [Tt][Xx][Tt] とする手もアリですね。
最近のPerlの文字コードサポートについて解説したページを紹介してもらえますか?
File::DosGlobは?
$perl -MFile::DosGlob=glob -e 'print <*.txt>'

>>972さんが言っているように、aaa.pl *.txtと打ち込んだ時、
*.txtを展開しているのはPerlじゃなくてシェルだから、解法は
シェルの機能に依存しちゃうので厳密に言えば板違いかも。
Perlのパーサーは他のスクリプト言語と比べても重そうなのに、
どうしてPerlはこんなに速いんでしょうか。
とりたてて速いという程でも。
ユーザーが多いからそんだけバグも早くつぶれるし、
色々口出し^H^H^H助言してくれる輩もいるから、
自然と処理系も最適化されるんじゃないの。
980教えてモンゴメリー伯爵:04/05/25 22:06
>>960
960よ あっぱれじゃ見事処理できたぞよ
              
ほうびをやろう   これほうび→ (ω)
>>978
プリコンパイル方式だからとかそういう話でなくて?
パーサなんてどれも速度かわんねーだろ
C にしたってコンパイルが遅いのは、普通は毎回巨大なヘッダをコンパイル
しててるとか最適化のせいでしょ。そもそも Perl はネイティブコードのジェネレートも無いし。

何万行もあるコードかいたらそれなりに遅いとおもうけど、普通のスクリプトのサイズじゃ
たかが知れてるわな。
未だにPHPは速いとか言ってる人いるのかなあ
PHPは速い
>>985
はいはい
webPron板に行けばPHPが早いって言ってるヤツいぱーいいてる。
VBとPerlに詳しい方教えて下さい。
VBでPowerPointを操作するVBAをマクロ記録機能を使って作ったのですが、
これをPerlに置き換えられなくて困っています。
わかる方がいたら教えて下さい。

ActiveWindow.Selection.SlideRange.Shapes.AddPicture(FileName:="D:\test\test.bmp", LinkToFile:=msoFalse, SaveWithDocument:=msoTrue, Left:=75, Top:=-74, Width:=570, Height:=689).Select
With ActiveWindow.Selection.ShapeRange
.Fill.Transparency = 0#
.Height = 344.62
.Width = 285.12
End With
With ActiveWindow.Selection.ShapeRange.ActionSettings(ppMouseClick)
.Hyperlink.Address = "D:\test\test.bmp"
.SoundEffect.Type = ppSoundNone
.AnimateAction = msoFalse
End With
With ActiveWindow.Selection.ShapeRange.ActionSettings(ppMouseOver)
.Action = ppActionNone
.SoundEffect.Type = ppSoundNone
.AnimateAction = msoFalse
End With

環境は
Pen3:1GHz
Memory:2GB
OS:Windows2000Professional
Soft:MSPowerPoint2002SP-2
    ActivePerl5.6.1.635
です。
そろそろ次スレ誰か立ててくり。
俺は立てられないので。
>>990
乙!
>>988
ひょっとして、全くやり方がわからんから、お前ら Perl で書いてアップしろって言ってるのか?
だったら、とりあえず \Perl\html\faq\Windows\ActivePerl-Winfaq12.html でも読めよ。

5.6.x にはこのファイルないかもしれんけど。無かったら 5.8.3 入れてドキュメントだけ見なよ。


がんばって書いてみたけど思ったように動かないなら、どう書いたのか書きなよ。

大体が、Perl でそれを書いたとして、できるのは実行した時に開いてるファイルに対する
処理だけなんだけど、それでいいのか?