• ベストアンサー

ダイアモンド演算子<>に対するbinmodeについて

お世話になります。 ActivePerlでは、UNIXのPerlとの互換性を持たせるために、Windows改行\r\n(0x0d0a)を読み込んだら\n(0x0a)を読み込んだように、\n(0x0a)を書き出したら\r\n(0x0d0a)を書き出したように動作します。 この動作を抑制するためには、binmodeを使います。 ところが、 binmode STDOUT; のように行うと、確かに標準出力で普通に\nを出力すると、0x0aが出力されるのですが、<>(ダイアモンド演算子)に関しては、なんと言うファイルハンドルにbinmodeを使っていいかわかりません。 どうすればいいでしょうか。 具体的にいうと、以下のようなファイルをダンプするプログラムで、現状では0d0aが0aと表示されます。 #! perl #fileDump.pl while (<>) { for (split //) { print unpack "H2", $_; } } PerlのマニュアルによるとARGVというファイルハンドルを使っているという話がありましたが、 binmode ARGV; ではダメでした。 どうぞよろしくお願いします。

  • Perl
  • 回答数2
  • ありがとう数9

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

ちょっと検索してみた. ま, 無保証ですが.

参考URL:
http://x68000.q-e-d.net/~68user/cgi-bin/wwwboard.cgi?log=3193
loverevo20
質問者

お礼

ありがとうございます。 binmodeでなくてPerlIOを使う方法ですね。 INでなくてIOを指定すれば STDOUT の改行自動変換も抑制されますね。 貴重な情報ありがとうございます! <>にbinmodeを利かせる方法をご存知の方、継続してお願いします。

その他の回答 (1)

  • kuroizell
  • ベストアンサー率55% (95/170)
回答No.2

私も先日改行の自動変換で不具合に見舞われましたが、以下で切り抜けました。 @array = map { s/\r//g; $_ } @array; または $_ =~ s/\r//g;

loverevo20
質問者

お礼

ありがとうございます。 読み込んだ後にデータを直で使う方法ですね。 これもいいですね!

関連するQ&A

  • binmode関数を2回繰り返すと結果が狂う?

    お世話になります。 「まるごとPerl」という雑誌の記事をWindowsに移植してEncodeモジュールの勉強中です。 #! perl # list1 -- 日本語の文字を1文字として解釈 use strict; use warnings; use utf8; # スクリプトは UTF-8 で保存 binmode STDOUT, ':encoding(cp932)'; # 出力はCP932に変更 #4文字目のカから4文字、カタカナと表示される my $text = '漢字、カタカナ、ひらがなの混じったtext'; print substr($text, 3, 4); というスクリプトをUTF-8で保存してWindowsのDOS窓で(コードページはデフォルトのCP932のままで)実行すると C:\> list1.pl カタカナ と無事表示されます。 ところが、うっかり間違えて binmode を binmode STDOUT, ':encoding(cp932)'; # 出力はCP932に変更 binmode STDOUT, ':encoding(cp932)'; # 出力はCP932に変更 と2回書いてしまうと、結果がこうなります。 C:\> list1.pl "\x{00ca}" does not map to cp932. "\x{00de}" does not map to cp932. "\x{00ca}" does not map to cp932. "\x{00e9}" does not map to cp932. \x{00ca}\x{00de}\x{00ca}\x{00e9} これはいったい何が起こっているのでしょうか。 binmode はあるファイルハンドルのエンコードを決めるもので、何回やっても結果が一緒なのかと思っていました・・・。 00ca、00de、00ca、00deというのも、CP932の「カタカナ」のダンプ「834A 835E 834A 8369」をどうすれば得られるのか不明です・・・。 よろしくお願いします!!!

    • ベストアンサー
    • Perl
  • 10進数→2進数の出力について

    コマンドライン引数から10進数の値を入力して 2進数に変換して出力しようとしています。 ※入力される10進数の値はかなり大きなものを想定しています。 現在は下記のようなコードで変換しようとしていますが失敗しています。 動作環境は『WindowsXP、Activeperl-5.12.4.1205』です。 拙い説明ですが、よろしくお願いいたします。 # コマンドライン引数は「9223372036854775808」 $n = unpack("B8", pack("C", $ARGV[0])); print n; # 実行結果は「11111111」 # 期待している出力結果は「1000・・・000」(←0が64個) 9223372036854775808

    • ベストアンサー
    • Perl
  • system で実行したプログラムの標準出力を変数で受け取りたい

    実行結果を標準出力に出力する cプログラム A があります。 perl から system を利用して A 呼び出し、その実行結果を perl で加工する仕組みを考えています。 今のところ、標準出力を一旦変更して、テンポラリのファイルに出力させ、再度そのファイルをオープンして perl で利用するという形で何とか実現できています。 open (SAVESTDOUT, ">&STDOUT") or die "..."; #(1) open (STDOUT, ">$tempFile") or die "..."; #(2) system "A"; #(3) close(STDOUT) or die "..."; #(4) open(STDOUT, ">&SAVESTDOUT") or die "..."; #(5) という感じです。 一旦テンポラリーのファイルを介するところがスマートでないので、直接変数に標準出力結果を落したいです。 (1) そのまま (2) 標準出力を perl の変数に変更 (3) そのまま (4) なし (5) そのまま といった感じで実現したい(もちろんより良い解法があれば尚宜しいです)のですが、可能でしょうか? ご教授ください。宜しくお願いします。

    • ベストアンサー
    • Perl
  • 暗号・復号 cgiスクリプトについて

    こんにちは。 私はcgiスクリプトにて文字を暗号化させたいと思っています。 友人に暗号化復号化スクリプトを書いてもらったのですが どうやって動かすかよくわかりません。 http://www.rescue.ne.jp/cgi/htpasswd/makepwd-des/ 上記のサイトのように出力させたいのですが、スクリプトだけでは私には難しいです。 その友人は海外に行ってしまい連絡が今は取れないんです。 sub enc_string{ my ($key, $string) = @_; my @map = (('A' ... 'Z'), ('a' ... 'z'), ('0' ... '9'), '+', '&'); my @key = unpack('C*', $key); my $str = ''; my @x = map { int(rand(200)) } (0 ... 2); @key = map {$x[$_] ^ $key[$_]} (0 ... 2); while($string ne ''){ my $n = substr($string, 0, 3, ''); my @n = unpack('C3', $n); map{$n[$_] ^= ($key[$_])} (0 ... 2); @key = unpack('C3', $n); @key = map {$x[$_] ^ $key[$_]} (0 ... 2); my $a = $n[0] >> 2; my $b = (($n[0] & 3) << 4) | ($n[1] >> 4); my $c = (($n[1] & 15) << 2) | ($n[2] >> 6); my $d = $n[2] & 63; $str .= $map[$a] . $map[$b] . $map[$c] . $map[$d]; } my $a = $x[0] >> 2; my $b = (($x[0] & 3) << 4) | ($x[1] >> 4); my $c = (($x[1] & 15) << 2) | ($x[2] >> 6); my $d = $x[2] & 63; return $str.'<>'.$map[$a].$map[$b].$map[$c].$map[$d]; } このスクリプトで暗号するようですが、初心者なものでどうやって 手直し?追加すればよいのでしょうか? #!/usr/bin/perlを最初に入れるのはわかります。 あとこのスクリプトの他に復号、MD5にて暗号のスクリプトがあります。 まずは暗号化させてみたいのですが、よろしくお願いします

  • データをCGIに渡す形式に変換する。

    中に入れ子で別のCGIが入っているCGIを考えました。 <iframe ・・・ action="入れ子.cgi?data1=なんたら&data2=かんたら"></iframe> みたいな感じです。 data1とdata2は親のCGIで考えて入れ子のCGIに渡します。 ところでCGIにマルチバイト文字を渡す場合は、何らかの処理をして  %([a-fA-F0-9][a-fA-F0-9]) の形式に変換されます。 これを元に戻す方法が  =~s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg; であることは分かったのですが、ならば元の文字列を  %([a-fA-F0-9][a-fA-F0-9]) に変換する方法が  =~s/[^a-fA-F0-9]/unpack("H2", $1)/g; かと思いきや、うまく動きません。 どのように式を書けばいいのでしょうか? #! usr/bin/perl -d use utf8; binmode(STDOUT,'utf8'); our %in=(textfield=>'テスト',submit=>'送信'); foreach(keys %in) { my $unpack=$in{$_}; my $unpack=~s/[^a-fA-F0-9]/unpack("H2", $1)/g; my $pack=$unpack; $pack=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg; print "$_ &nbsp; $in{$_} &nbsp; $unpack &nbsp; $pack <br>\n"; }

    • ベストアンサー
    • Perl
  • ファイル出力をUTF8NではなくてUTF8で行いたい

    おせわになります。 Shift-JISで記述したPerlで、ファイル出力をしようとしています。 ------------------------------------ #!/usr/local/bin/perl use encoding 'shiftjis'; $hoge="ほげ" open(OUT,">file.txt") binmode OUT; print OUT $hoge; close(OUT); ------------------------------------ 希望はUTF8での出力なのですが、UTF8Nで出力されてしまいます。 どのようにすればいいのかご教授よろしくお願いします。

    • ベストアンサー
    • Perl
  • バイナリファイルの出力

    「test.dat」というファイルをブラウザから ダウロードさせるためにバイナリ出力をしたいのですが、 空ファイルばかりできて上手くいきません。 以下のようなコードなのですが、どこが悪いでしょうか? ご教授ください。お願いします。 症状:ブラウザからダウンロードすると、ファイル名は正しいが 空のファイルになっている 環境:perl 5.8.7 windows server2003 ----------------------------------------------------------- #!/usr/local/bin/perl print "Content-Disposition: attachment; filename=\"test.dat\"\n"; print "Content-Type: application/octet-stream\n\n"; open(IN, "test.dat"); binmode(IN); binmode(STDOUT); print while (<IN>); close(IN); -----------------------------------------------------------

    • ベストアンサー
    • Perl
  • 圧縮ファイルの取得

    http://okwave.jp/qa/q8823112.html こちらで質問させていただいたように、/public_html/file.zipではなく、/file.zipの ファイルをダウンロードさせるために以下の方法を取りました。 print "Content-type: application/x-tar\n\n"; open( FH, "$filename" ); binmode FH; binmode STDOUT; print <FH>; close( FH ); この方法では、ブラウザで表示させてダウンロードできるようになったのですが、 これをperlで、wgetか、何かを使って取得したいと考えています。 ところが、wgetで試したところ、zipファイルではなく、cgiページ自体のソースの取得になってしまいました。 zipファイルを取得するにはどのようにしたらよいのでしょうか。 perlの知識があまりないので、どうしても解決できません。 宜しければ具体的に書き方を教えていただけると大変助かります。どうぞよろしくお願いいたします。

    • ベストアンサー
    • Perl
  • perlで動画を表示させたい

    perlで動画を表示させたいのですがうまくいきません。 print "Content-type: video/mpeg\n\n"; open FH,"foo.mpg"; binmode FH; binmode STDOUT; while (<FH>) { print STDOUT; } close FH; exit; MIMEのタイプがちがうのですか? サーバーに設定されているMIMEタイプです。 video/mpeg mpeg mpg mpe video/quicktime qt mov video/x-msvideo avi video/x-sgi-movie movie

    • ベストアンサー
    • CGI
  • socketを使って外部のファイルを呼び込む

    $Host = 'abc.hogehoge.co.jp'; $Page = "/test_order.cgi?pass=1234&id=1234' $Addr = (gethostbyname($Host))[4]; $Name = pack("S n a4 x8", 2, 443, $Addr); socket(S, 2, 1, 0); connect(S, $Name); binmode(S); select(S); $| = 1; select(stdout); print S "GET $Page HTTP/1.0\r\n\r\n"; $Data = ''; while (<S>){ $Data = $_; } close(S); print"$Data"; 現在ある決済システムを組み込もうとしております。 上のように外部ホストのアクセスしてパスワードやID、その他あるのですがそれで接続していてもどうにも$Dataに出力されません。 print S "GET $Page HTTP/1.0\r\n\r\n"; とありますが外部ファイルはhtmlファイルではありません。たんなるテキスト文字が出力されるはずです。 直接ブラウザに https://abc.hogehoge.co.jp/test_order.cgi?pass=1234&id=1234' とたたくとテキストが出力されます。 なにかまちがっているのでしょうか? 恐れ入りますがご教授お願いします

    • ベストアンサー
    • CGI