68user's page 掲示板

Prev< No. 2275〜2280> Next  [最新発言に戻る] [過去ログ一覧]
No. 2275 # 68user 2001/11/19 (月) 13:11:21
>>2267 武田 一浩
$socket = IO::Socket::INET->new(
                            PeerAddr => '192.168.0.255',
                            PeerPort => 2425,
                            Proto => 'udp',
                    ) || die "$!";
とした方が、どこでエラーが出ているかを把握しやすいでしょう。

> とりあえず、Perlやスクリプトには異常がなさそうなので、

そうですね。perl か OS の問題ではないかと思います。

あと、ifconfig -a して、デバイスに
    fxp0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
と、「BROADCAST」が付いていてブロードキャストに対応していることを
確認して下さい。もしかして ppp デバイスだったりすると付いてないかも。

>>2268 もみの木
> 現象として、すぐにExcelが表示されてしまいます。
要は、ASP は全く関係なくて
    <a href="HTTP://××/××/××/○○○.xls">hoge</a>
というリンクをクリックしたときの挙動ですよね? Windows は
よくわからないので、
    http://www.parkcity.ne.jp/~chaichan/bin/qanda.cgi?modefg=9
で質問した方がよろしいと思います。


あとの話題は後ほど。

No. 2276 # ふくし [E-mail] 2001/11/19 (月) 13:48:26
みーさん:

なんかすいません。
たぶんぼくのやり方すごく非標準的なので、
もっとカッコいい方法はいくらでもあると思うんですが、、

find はファイル名の検索、
grep はファイルの中の文字列の検索、
で、合ってます。
ぼくのスクリプトでは各ファイルの中での文字列検索/置換を
自分で書いています。(while のあたり)

#! /usr/local/bin/perl -w
# kokyakuokyaku

$tmp = "TempFileDayooon"; # 中間ファイル。存在しないファイル名を選ぶこと

for $file (`find . -print`) {
                  chomp $file; # すいません、ココ、間違ってました
                  if (-f $file) {
                                  open FILE, $file;
                                  open TMP, ">$tmp";
                                  while (<FILE>) {
                                                  s|/srv/kokyaku/|/srv/okyaku/|g;
                                                  print TMP;
                                  }
                                  close TMP;
                                  close FILE;
                                  rename $tmp, $file;
                  }
}

`UNIXコマンド`
    …バッククォート(`)でUNIXのコマンドを囲むと、
        出力結果をリストで返す

for $変数 (リスト) {
    ...なんだかんだ...
}
    …リストの要素を1個ずつ $変数 に入れながら、
        「なんだかんだ」の部分を繰り返す。
        上では find の結果を1行ずつ $file に入れて処理している。
        それはカレント ディレクトリ以降のファイル/ディレクトリである。

% find . -print
    …カレント ディレクトリ以降のファイル/ディレクトリを一覧表示する。

chomp $file;
    …$file(find の結果の1行)の末尾から改行を取り除いて、
        ファイル/ディレクトリ名として正しいものにしている

-f 文字列
    …「-f」はファイルテスト演算子のひとつ。
        右に来る文字列がふつうのファイルだったら真を返す。
        ここではディレクトリをはじいている。

open FILE, $file;
    …ファイル名 $file のファイルを入力で開いて、
        ファイルハンドル FILE で入力アクセスできるようにする

open TMP, ">$tmp";
    …ファイル名 $tmp のファイルを出力で開いて、
        ファイルハンドル TMP で出力アクセスできるようにする

while (<FILE>) {
    ...なんだかんだ...
}
    …ファイルハンドル FILE で読み込まれる
        ファイル $file(ここでは find の結果のうち、ファイルのみ)の
        1行1行を、$_ という特殊な変数に入れながら
        「なんだかんだ」の部分を繰り返す。
        $file を読み終わったらループを脱出する

s|/srv/kokyaku/|/srv/okyaku/|g;
    …デフォルトの作用対象である変数 $_ に対して、
        「/srv/kokyaku/」を「/srv/okyaku/」に置換する。
        s は substitute(置換)、g は global(全体的に)の略。
        g を略すと1行に1回しか置換しない

print TMP;
    …TMP ファイルハンドルに、デフォルトの作用対象 $_ を出力する
        ここで $_ は FILE の1行1行に
        「/srv/kokyaku/」=>「/srv/okyaku/」の置換を施したものである

close TMP;
close FILE;
    …ファイルを「閉じる」。
        (ファイルアクセスのために確保されていたメモリなどの資源を解放する)

rename $tmp, $file;
    …置換する前のファイル名が $file、
        置換したあとのファイル名が $tmp なので、
        $tmp を $file に改名する。
        これで置換したファイルで元ファイルは上書きされ、
        中間ファイル TempFileDayooon は消えてなくなる

こんな感じでしょうか。

No. 2277 # 68user 2001/11/19 (月) 14:17:20
>>2271 初心者みーです。
複数ファイルの中身を一括置換する、という目的に限れば、
    http://x68000.startshop.co.jp/~68user/unix/pickup?perl
の perl -pi.bak -e .. ところをどうぞ。

> findコマンドで、ファイル(シェル)中に/usr/kokyakuと
> 記述されているファイル名をfindコマンドで探す場合は、
> どのように記述すればよいのでしょうか?
いろいろありますが、以下のような感じです。

    % find . -exec grep -l /usr/kokyaku {} \;
          … 機能は実現できるけど、遅い。
    % grep -l *
          … ファイル数が多すぎるとダメ。ファイル数が数千程度ならこれでいいでしょう。
    % find . -print | xargs grep -l
          … ファイル数が多くても OK。
    % find . -print0 | xargs -0 grep -l
          … ファイル数が多くても OK。ファイル名に改行が含まれていても OK。

今回は grep -l でいいのではないでしょうか。

あと、
> sed 's/\/usr\/kokyaku/\/usr\/okyaku/g' * >*の出力
で実現できることはわかっているので、後はこれを複数のファイルに対して実
行すればよいのです。いろいろ方法はありますが、お勧めなのは「文字列をい
じくってコマンドラインを作り、sh に喰わせる」方法です。

grep -l * で、
    file1
    file2
    file3
という出力が得られるとします。次に
    grep -l * | sed "s|\(.*\)|sed 's./usr/kokyaku./usr/okyaku/.g' < \1 > out/\1 | "
とすると、
    sed 's./usr/kokyaku./usr/okyaku/.g' < ./file1 > out/./file1
    sed 's./usr/kokyaku./usr/okyaku/.g' < ./file2 > out/./file2
    sed 's./usr/kokyaku./usr/okyaku/.g' < ./file3 > out/./file3
という文字列が得られます。それをよく確認して、よさそうなら
    grep -l * | sed "s|\(.*\)|sed 's./usr/kokyaku./usr/okyaku/.g' < \1 > out/\1 | " | sh
と末尾に | sh を付ければ、そのまま実行されます。

正しいコマンドラインができるまでは「| sh」を付けずに試行錯誤すれば
よいので、いろいろなところで応用が効くと思います。

No. 2278 # 68user 2001/11/19 (月) 14:20:22
>>2270 ふくし
> 場違いでしたら情報のポインタや、討議するのにふさわしい
> 掲示板等教えてください。
場違いではないですが、わかりません。会社では Windows Me だし (笑)

ふさわしいところは… fj.kanji くらいしか思い付かないなぁ…。

後は
>>2269 kouji
ですが、これはちょっと調べてから回答したいと思います。

No. 2279 # みー(お礼) [E-mail] 2001/11/19 (月) 16:05:11
ふくしさん、68userさんどうもいろいろありがとうございました。とっても勉強になりましたし、助かりました。perl -pi.bakの方法で、一括変換変換させる方法をバックアップファイルも一緒に作成できるので、実施したいと思います。簡単なテストをしたところ、大丈夫そうでしたので…。他の方法も、今後時間のある時に試してみたいと思います。迅速なご回答と親切な説明、本当にありがとうございました。

No. 2280 # ぷたろ 2001/11/19 (月) 19:38:13
始めましてm(__)m
UNIXを学校で使っています。
家では使えないんでしょうか?
家にパソコンはあるのですが…(-.-;)

Prev< No. 2275〜2280> Next  [最新発言に戻る] [過去ログ一覧]