トップページ⇒tech
1001コメント350KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2011/08/20(土) 20:36:37.25
CGI についての質問は板違いです。WEB プログラミング板でどうぞ。
CGI と Perl の区別がつかない人も WEB プログラミング板に行ってください。
(WEB プログラミング板: http://hibari.2ch.net/php/ )

このスレでは(CGI 以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。

"The duct tape of the Internet" こと、Perl についての質問箱です。
"There's more than one way to do it" ということで、
Perl の奥深さについて皆で語り合い、追求してまいりましょう。

http://www.perl.org/get.html
● 2011/08/20 現在の最新版: 5.14.1

▼ 前スレ
Perlについての質問箱 47箱目
http://hibari.2ch.net/test/read.cgi/tech/1306333092/
リンク集は >>2-3辺り
Perl 日本語処理の基礎の基礎 >>4辺り
0153デフォルトの名無しさん2011/09/02(金) 13:57:22.51
>>151
use utf8 してれば、各関数はそれぞれ下の1行で済む。

pops → substr($str, 0, 1);
pushs → $str .= 'TEST';


もっと付加価値を付けなきゃ作る意味が無いよ。
0154デフォルトの名無しさん2011/09/02(金) 15:47:46.46
>>151
$_[0]が引数のエイリアスだからそれを操作すれば呼び出し元を操作したことになるよ

sub pops ($) {
my @t = split // , $_[0] ;
pop @t ;
$_[0] = join "", @t ;
}
0155デフォルトの名無しさん2011/09/02(金) 16:27:18.62
>>152
> 1998年リリースの5.005から

おお。ありがとう。
手元の「新Perlの国へようこそ Perl5対応版」には (?<= ) と (?<! ) は載ってなかった。
かわりに ?PATTERN? なんてのを再発見。こんなの使ったことなかったなあ。
いい機会なんで正規表現の仕様を見直して覚え直しておきます。
0156デフォルトの名無しさん2011/09/02(金) 16:30:51.29
詳説 正規表現
0157デフォルトの名無しさん2011/09/02(金) 16:36:34.01
>>155
(?<= ) と同じような機能で量指定子も使える\Kというのも最近できたよ
0158デフォルトの名無しさん2011/09/02(金) 16:40:03.27
>>146
/^(?!.*?fuga)(?=.*?hoge)/
でどう?

>>154
返り値は?
0159デフォルトの名無しさん2011/09/02(金) 22:45:51.20
negative (positive) lookahead (lookbehind) assertion は可変長文字列受けつけないだろ。
どうしても lookahead で表現したいとなると、以下みたいな超絶マゾ正規表現になる。
メリット皆無。
while( <DATA> ){
chomp ;
if (m{ (?: # キャプチャしない。
(?<=(?!fuga).{4}) # fuga じゃない 4 文字 の右にカーソル
| # か、
(?<=^.{3}) # 行頭の任意の 3 文字 の右にカーソル
| # か、
(?<=^.{2}) # 行頭の 2 文字 の右にカーソル
| # か、
(?<=^.) # 行頭の 1 文字 の右にカーソル
| # か、
(?<=^) # 行頭の 0 文字 の右にカーソル
)
hoge # で且つ hoge
}x ){
print "$_: hit!\n" ;
}
}

__DATA__
fugahoge
hoge
dhoge
ddhoge
dddhoge
ddddhoge
dddddhoge
0160デフォルトの名無しさん2011/09/02(金) 23:06:02.14
すまん少し前のレスくらい読むべきだった。
5.14.1だと、m{\K(?:(?!fuga).{4}|^.{0,3})hoge} で行けるみたい。
へ〜
0161デフォルトの名無しさん2011/09/03(土) 00:35:11.96
後読みは固定長限定だけど先読みは可変長でも使える
0162デフォルトの名無しさん2011/09/03(土) 01:03:35.71
そうだったorz...
0163デフォルトの名無しさん2011/09/04(日) 14:22:30.05
WWW::Mechanizeに関する質問です。
imgタグでdata-src属性のURLが特定の正規表現にマッチするもののみを、全て抽出することは出来るでしょうか?
imgタグのsrc属性であれば$mech->find_all_images(url_regex => qr//)としてやることで出来ると分かったのですが、
data-src属性の場合のやり方がわかりません。どなたかご助言していただけると幸いです _ _
0164デフォルトの名無しさん2011/09/04(日) 18:39:36.69
そもそもそのimg要素のdata-src属性ってのはいったい何なんだ?
聞いたことないんだが。
0165デフォルトの名無しさん2011/09/04(日) 19:15:05.12
その書き方は HTML5 だよ
0166デフォルトの名無しさん2011/09/04(日) 21:38:51.91
>>163
$mech->content()を別のパーザに突っ込むしかない。
0167デフォルトの名無しさん2011/09/04(日) 22:43:02.41
もしくはWWW::MechanizeがHTML5対応になるのを待つか。
しかしHTML5ってまだ勧告レベルでもないんだろ。(2014年仕様確定予定らしい)
世の中気の早い奴が多すぎるわな。
01681632011/09/05(月) 09:10:35.64
>>164 自分も始めて見ました。なお、件のサイトはpixivです。
>>165 ありがとうございます。なるほど・・・
>>166 ありがとうございます!そうしますー
>>167 ですねー
ありがとうございました!
0169デフォルトの名無しさん2011/09/05(月) 19:14:38.22
質問があります。
最近のメールフォーム用CGIは機能が多すぎてJqueryのバリデーションと機能が被ってしまいます。
そこでJqueryでバリデーションしてデータだけをpostさせたいのですが、ただデータを送るだけのメールフォームCGIはどういうふうに書けばいいのでしょうか。
0170デフォルトの名無しさん2011/09/05(月) 19:19:38.27
>>169

>>1
webprogへ行け
0171デフォルトの名無しさん2011/09/05(月) 21:34:28.95
>>169
既存のCGIからバリデーション部分を削除すれば目的は達せられる。
だがJavaScript(jQuery)の動作しない環境から送られたデータはどうするつもりだ。
あるいは悪意をもって偽装したデータを投げてくる奴がいないとも限らないぞ。

スレ違いでアレだが、送信されてきたデータは常に疑ってかかれ。検証しろ。
問題ないシロモノという前提で扱ってるといつか痛い目をみるぞ。
0172デフォルトの名無しさん2011/09/05(月) 22:11:49.39
スレ違いってここでセキュリティネタ話してもぜんぜんOKだろ
171さんはmalaさんですか???

まじ頭がセキュオタになってますよ
0173デフォルトの名無しさん2011/09/05(月) 22:14:18.16
それ以前に、CGIの話しで誘導済みだろ
01741712011/09/05(月) 22:35:02.65
>>172
いや、セキュオタ(?)でなくてもこれくらいは普通に気を使うでしょ?JK
ユーザが自分だけなら多少のコーディングの手抜きは運用でカバーもできるけど。
受付フォーム(を受け取るCGI)なんて誰がどう使うかわかんないんだからさ。
0175デフォルトの名無しさん2011/09/05(月) 22:36:28.72
言っている自分が一番知識ないというオチ
0176デフォルトの名無しさん2011/09/05(月) 22:44:39.38
>>174
誘導されてるんだから煽りにかまってないで放置でおk
01771712011/09/05(月) 22:48:41.24
>>175
> 言っている自分が一番知識ないというオチ

まあその可能性も十分ある。自戒自戒。
では名無しに戻ります。
0178Perl忍者2011/09/05(月) 22:52:25.12
171みたいなバカは

なにを今更感でっぱなし
0179デフォルトの名無しさん2011/09/05(月) 22:54:42.61
久し振りに見たなお前perl卒業するんじゃなかったのか?
0180Perl忍者2011/09/05(月) 22:54:50.43
当たり前のことを説明してるやつみるとむかついてくるな
0181デフォルトの名無しさん2011/09/06(火) 00:37:35.04
そこでノーガード戦法ですよ
0182デフォルトの名無しさん2011/09/06(火) 01:49:50.97
perl貧者まだ生きてたの?
0183デフォルトの名無しさん2011/09/06(火) 03:20:52.67
Strawberry Perlの5.14系が滞っているのは、
何が原因なんでしょうか? 技術面、それとも人的資源面?
ttp://strawberryperl.com/

リポジトリもコミットが途絶えているみたいですし、心配です。
ttp://hg.curtisjewell.name/Perl-Dist-Strawberry-BuildPerl-5140
ttp://hg.curtisjewell.name/Perl-Dist-Strawberry-BuildPerl-5141

ここでもドンピシャな回答はなかったみたいです。
ttp://www.perlmonks.org/?node_id=910099
0184デフォルトの名無しさん2011/09/06(火) 06:31:53.13
Perl賢者とかいちいち絡まなくていいと思うよ
放置放置
0185デフォルトの名無しさん2011/09/06(火) 15:19:26.18
デスクトップに出力させたい場合、うまくスペースが設定できません。
どのようにしたら良いのでしょうか?
ためしにglobで拾ってみると下記のようになります。
�@の部分をデスクトップディレクトリにしたいのですが、どう書けばよいのでしょうか?

use utf8;
use Encode;

#拾える(Documents and SettingsをDocuments*としてスペースを書かない)
my $path = [ map{ encode('utf8', decode('cp932', $_ ) ) } glob( encode('cp932', "/Documents*/user/デスクトップ/*" ) ) ];
#拾えない
my $path = [ map{ encode('utf8', decode('cp932', $_ ) ) } glob( encode('cp932', "/Documents and Settings/user/デスクトップ/*" ) ) ];

my $outPath = "�@どう書いたらいい???";
open(OUT, ">$outPath")
print OUT encode('utf8', "あああああ");
close(OUT);
01861852011/09/06(火) 15:27:11.93
動作環境はeclipseを使っています。
今ググっていたらeclipseの問題のような気がしてきた。。
0187デフォルトの名無しさん2011/09/06(火) 16:02:43.69
データをハッシュにまとめたいけどキーの順序も保存しておきたい場合は
1ハッシュとは別にキーの配列作る
2ハッシュの持つ要素に順序数を含める

どっちがよさそうですか?

1は
@key=(qw/aaa bbb ccc/);
@hash{@key} = (9,8,7);

2は
$hash{aaa}=[0, 9]

のような感じです
それとも単純に[0, 'aaa', 9]と全部配列にまとめてしまうのがいいでしょうか?
0188デフォルトの名無しさん2011/09/06(火) 16:07:20.10
>>187
http://perldoc.jp/docs/perl/5.10.1/perlfaq4.pod#How32can32I32always32keep32my32hash32sorted63
0189デフォルトの名無しさん2011/09/06(火) 17:45:02.85
下記のような正規表現でカッコ()の値を配列に入れるにはどのようにすればよいでしょうか?
個数が変化するので$1などは使えないです。

m|value=([^ ]+)|gxms;
0190デフォルトの名無しさん2011/09/06(火) 18:32:17.11
>>189
while等でループまわして$1を適当な配列にpush
0191デフォルトの名無しさん2011/09/06(火) 18:34:40.10
>>187
2.はhash呼ぶ度に、sort かけなきゃいけないから、
頻繁に呼ぶ場合にはメリットがない
for ( sort keys %hash ){ #normal
for ( sort { $hash{$a}->[0] <=> $hash{$b}->[0] } keys %hash ){ #順序数を含める

1.は良く使う手段。

>>188はウィザードのやる事で、
>本当にこれが必要ですか? :)
てーのは、1.みたいな手段を念頭に入れた上での記載。と、いらぬフォロー。

>>189
my @dat = m|value=([^ ]+)|gxms;
my @dat = ( $hoge =~ m|value=([^ ]+)|gxms ) ;
0192デフォルトの名無しさん2011/09/06(火) 18:41:30.76
>>189
my $str = <<'EOD';
value=foo
value=bar value=baz
value=
quux
value=
lvalue=corge
rvalue=grault
EOD
my(@v1, @v2);
push @v1, "[$1]\n" while $str =~ m|value=([^ ]+)|gxms;
push @v2, "[$1]\n" while $str =~ /\bvalue=(\S+)/g;
print @v1, "---\n", @v2;
0193デフォルトの名無しさん2011/09/06(火) 19:47:00.69
>>185
my $path = [ map{ encode('utf8', decode('cp932', $_ ) ) } glob( encode('cp932', q{"/Documents and Settings/user/デスクトップ/*"} ) ) ];

my $outPath = "/Documents and Settings/user/デスクトップ/foo.txt";
01941852011/09/07(水) 01:10:47.58
>>193

一つ目は出来ました。
二つ目はやはりできないようです。
eclipseでググッたらスペースうんたらとあるのでやはりeclipseの問題のようです。

ありがとうございました。
0195デフォルトの名無しさん2011/09/07(水) 02:36:27.74
これからPerlに手をだそうとしているのですが、質問があります。

perlは、SJIS、EUC、UTF-8の3つの文字コードの中で何が一番適しているのですか?
それぞれの良い点と悪い点も教えていただきたいです。

もし、ほとんど差がないとすれば、ホームページをつくる上でこれから主流になると
考えられる文字コードがどれか教えてください。よろしくお願いします。
0196デフォルトの名無しさん2011/09/07(水) 02:42:19.81
UTF

あとは内部表現でggr
0197デフォルトの名無しさん2011/09/07(水) 03:39:06.29
>>195
今のPerlはUTF-8(かLatin-1かascii)で書くことが前提なのでUTF-8一択。
他のコードで書けなくもないけど実行前にフィルターかけるだけでいろいろ問題がでるので強く非推奨とされている。

ホームページ → 個人的な感触では既にUTF-8が主流
0198デフォルトの名無しさん2011/09/07(水) 08:27:35.87
あるフォルダに
-------------------
AAAA_A9999.jpg
AAAA_B1111.jpg
AAAA_C0000a.jpg
-------------------

といった感じでファイルがあるんですが、
これを _[ABC]以降の文字列でソートした結果を得たいです。

AAAA_C0000a.jpg
AAAA_B1111.jpg
AAAA_A9999.jpg

が期待する結果

dir /b | perl -ne "〜"

とワンライナーで行いたいです、ご教授お願いします。

0199デフォルトの名無しさん2011/09/07(水) 08:46:47.40
>>198
http://perldoc.jp/docs/perl/5.10.1/perlfaq4.pod#How32do32I32sort32an32array32by32anything41

dir /b | perl -e "@i=map/(?<=_[ABC])(.+)/,@f=<>;print@f[sort{$i[$a]cmp$i[$b]}0..$#i]"
0200デフォルトの名無しさん2011/09/07(水) 08:47:27.92
dir /b | sort
0201デフォルトの名無しさん2011/09/07(水) 09:59:03.82
>>194
$outPathをencodeし忘れてない?
02021892011/09/07(水) 10:43:18.03
>>190-192

うまく処理できました。
色んなやり方がありますね。
ありがとうございました。
0203デフォルトの名無しさん2011/09/07(水) 14:53:17.89
>>194


'"document files"'
02041942011/09/07(水) 16:47:53.40
>>201,203

おおおーーー!!
出来ました。
冷静に考えればglob()の時encodeしてるんだからopen()の時もencodeしないとですね。
スコーンと抜けてました。
ありがとうございます。
0205デフォルトの名無しさん2011/09/08(木) 00:54:41.53
ファイル名とかを並び替えする時に人間が見やすいsortはありませんか
大文字や小文字を同一視したり、
9の次に10が来たりするような感じの
0206デフォルトの名無しさん2011/09/08(木) 01:21:17.16
Sort::Naturallyとかどう?
使ったことはないけど
0207デフォルトの名無しさん2011/09/08(木) 18:58:02.37
Java,PHPとやってきてPerlも覚えろと会社から
何時間ぐらいで身につくの?
0208 忍法帖【Lv=40,xxxPT】 2011/09/08(木) 19:01:19.03
>>207
やる気さえあれば 
0209デフォルトの名無しさん2011/09/08(木) 19:13:46.16
それだけやって来たなら
トリッキーなやり方気にしないなら数時間〜数十時間?
当分の間はファニー文字付け忘れてコンパイラに怒られると思うがw
0210デフォルトの名無しさん2011/09/08(木) 19:30:43.37
多分phpからで突っかかって爆死するのは配列の@だ
0211デフォルトの名無しさん2011/09/08(木) 19:45:28.90
PHPも$付けるけど、Perlの付け方とは違うからね
最初のうちは???だろうなあ
0212デフォルトの名無しさん2011/09/08(木) 20:08:31.89
「身に付く」レベルだったら…100時間くらい?
0213デフォルトの名無しさん2011/09/08(木) 20:26:09.45
Cからならリファレンスとプロトタイプ…かな? 未だに混乱する。
0214デフォルトの名無しさん2011/09/09(金) 02:16:57.82
作った関数の引数をハッシュで受け取ると楽だという事に気が付いた。

その流れからか、% や @ を使わずに、無駄に
$data = []
とか、
$data = {}
とかやるクセが付いたw
0215デフォルトの名無しさん2011/09/09(金) 07:21:31.56
Hoge( foo=>1, bar=>2, baz=>3 ) ってやつ?
0216デフォルトの名無しさん2011/09/09(金) 09:17:53.50
Hoge( {foo=>1, bar=>2, baz=>3} ) じゃなくて?
0217デフォルトの名無しさん2011/09/09(金) 12:27:31.84
ハッシュではなくリファレンスだと予想
0218デフォルトの名無しさん2011/09/09(金) 12:33:28.67
すいません、少々分からない事があるので教えていただきたいのですが

use lib qw(/cgi-bin/mycpan/);
use URI::Escape;
use SHA::PurePerl qw(hmac_sha256_base64);

なぜかこれが通りません
Escape.pmは/cgi-bin/mycpan/URI/に
PurePerl.pmは/cgi-bin/mycpan/SHA/に入っており、実行ファイル(test.cgi)は/にあります。

/ test.cgi
└cgi-bin−mycpan┬SHA−Escape.pm
            └URI−PurePerl.pm という感じになっています。

これだけでエラーの原因が分かる方いませんか?
0219デフォルトの名無しさん2011/09/09(金) 12:34:49.64
ちなみにパーミッションはすべて705にしています。
0220デフォルトの名無しさん2011/09/09(金) 12:44:57.74
通りませんじゃなくてエラーメッセージ晒せよ。
0221デフォルトの名無しさん2011/09/09(金) 12:47:42.11
エラーメッセージが表示されないんですよ
だから困っていて・・・

Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator, xxx@xxx and inform them of the time the error occurred,
and anything you might have done that may have caused the error.

More information about this error may be available in the server error log.
0222デフォルトの名無しさん2011/09/09(金) 12:56:10.32
@hogeにある文字列を@fugaにハッシュリファレンスで入れたい場合、
下記よりシンプル&同等以上の速度で処理するにはどのように書けばよいでしょうか?

my @hoge = ( "AAA","BBB" )
my @fuga = ();
map{ push( @fuga, { NAME => $_ } ) } @hoge;
0223デフォルトの名無しさん2011/09/09(金) 12:57:00.58
>>221
板違いだからwebprog板へどうぞ。
ブラウザの結果じゃなくて鯖側にエラーログのファイルがあるから探すように。
0224デフォルトの名無しさん2011/09/09(金) 12:58:50.71
>>223
失礼しました
0225デフォルトの名無しさん2011/09/09(金) 13:06:07.88
>>222
文面どおりに解釈すると
my @fuga = ( {NAME=>'AAA'}, {NAME=>'BBB'} );
とか?

でも速度の問題は実際に計ってみないとわからないし、そんな些細な部分の速度を気にしても費用対効果が悪すぎる。
>>222の書き方でも十分シンプル&高速だと思うよ。
0226デフォルトの名無しさん2011/09/09(金) 13:28:50.21
>>222
速度はほとんどかわらないが(ちょっとだけ速かった)、シンプルはシンプル。
my @fuga = map {NAME => $_}, @hoge;
0227デフォルトの名無しさん2011/09/09(金) 13:54:03.03
push分だけ速くなるのか
0228デフォルトの名無しさん2011/09/09(金) 14:11:01.97
>>216-217
うん。そゆこと。
2個ぐらいなら、普通に Hoge($opt1, $opt2, $opt3) とか渡してるんだけど、
3個以上になったり、その戻り値をそのまま他の関数に渡したいときはハッシュのリファレンスが
もの凄く楽ちん。
02292222011/09/09(金) 17:56:43.80
>>225,226

出来ました!
ありがとうございました。
0230デフォルトの名無しさん2011/09/09(金) 18:13:32.03
print "Content-type: text/html\n";

if($LOGIN==0){
print  "location:login_form.cgi\n";
}
print "\n";

if($FORM{'soushin'} ne ""){
&toukou_write;   #投稿の書き込み
}

書き込みのsoushinボタンを押したとき、ログインしてないときはログインフォームに飛ばすようにしていますが
ログインフォームに飛んだはずなのに投稿の書き込みが実行されてしまいます。

locationで飛んだらそれ以降は実行されないんじゃないんですか?
0231デフォルトの名無しさん2011/09/09(金) 18:20:05.47
>>230
誘導も面倒だから答えてあげるけど
Content-typeの記述したらそうなるさ。
0232デフォルトの名無しさん2011/09/09(金) 18:25:30.02
'location: URI'をprintすると以降の処理が打ち切られるとかこえーよ
0233デフォルトの名無しさん2011/09/09(金) 18:39:24.00
>>207
#perlでは全てが文字列

use strict ;
use warnings ;

my $s = 4 ;
my $t = 7 ;

print $s . $t,"\n"; # 「47」を出力 (文字列として結合)
print $s + $t,"\n"; # 「11」を出力 (数値として足し算)
print $s x $t,"\n"; # 「4444444」を出力 (文字「4」を7回出力)
print $t x $s,"\n"; # 「7777」を出力 (文字「7」を4回出力)
0234デフォルトの名無しさん2011/09/09(金) 18:55:17.30
>>233
全て文字列…ではないぞ
. + x といった演算子が文字列として解釈するだけだ
0235デフォルトの名無しさん2011/09/09(金) 23:55:58.63
内部的には、文字列、整数、倍精度実数が自動的に変換されているんだけどな
0236デフォルトの名無しさん2011/09/10(土) 01:19:17.94
1時、2時というリファレンスがあります。
これに5を足して下記のようにしたいのですが、シンプルに書くとどんな感じになりますか?
mapあたりを活用するんでしょうか。

my $aaa = [ '01:00', '02:00', '04:00',〜,〜 ];

my $bbb = 〜

結果→ $bbb = '06:00;07:00;0900;〜;〜'
0237デフォルトの名無しさん2011/09/10(土) 01:35:23.27
いいえ、for(each)あたりを活用します。
02382362011/09/10(土) 01:47:53.41
>>237

どんな書き方になりますか?
今はこんなどんくさいことになっています。。↓

my $aaa = [ '01:00', '02:00', '04:00',〜,〜 ];
foreach( @$aaa ){
if( m|^(\d+):(\d+)$|xms ){
$time .= sprintf(",%02d:%02d",$1+5,$2);
}
}
$time =~ s/^,//xms;
0239デフォルトの名無しさん2011/09/10(土) 03:16:52.14
$bbb = join ';', @aaa;
$bbb =~ s/([0-9]{2}):/sprintf '%02d:', $1 + 5/ge;

こんな感じでどう?
19時以降だとありえない時間になるけどw
0240デフォルトの名無しさん2011/09/10(土) 03:58:39.44
>>236
my $bbb = join(';',
map{
m/(\d\d):(\d\d)/ ? sprintf("%02d:%02d", ($1 + 5) % 24, $2) : $_
} @{$aaa}
);
0241デフォルトの名無しさん2011/09/10(土) 06:17:52.52
>>238
その m// と s/// についてる xms ってオプション、すげー気持ち悪いんだけど…。
0242デフォルトの名無しさん2011/09/10(土) 06:30:16.08
PBP推奨だよ
strict, warnings と同様、空気同然に付ける人もいる
0243デフォルトの名無しさん2011/09/10(土) 06:31:08.89
ベストプラクティスにかぶれるとつけちゃうんだよな〜
0244デフォルトの名無しさん2011/09/10(土) 07:18:08.96
意味わかってて使うんならいいけど、
/x 使ってる割には空白も入れてないし、
/m 使うんなら ^ $ と \A \z の使い分けも普段から正確にしといたほうがいい
0245デフォルトの名無しさん2011/09/10(土) 07:20:03.08
なるほどそういうことか。PBP読んだことないモグリなんで知らなかった。ありがとう。
0246デフォルトの名無しさん2011/09/10(土) 08:05:06.64
>>235
1つのスカラー変数に文字列と数値が共存してるから各々を使い分けたりもできるね

404 Blog Not Found:perl - Scalar::Util::dualvar()
http://blog.livedoor.jp/dankogai/archives/51129553.html
0247デフォルトの名無しさん2011/09/10(土) 09:29:42.31
すべてが文字列というければ、
バイナリデータと文字列って区別つくの?
0248デフォルトの名無しさん2011/09/10(土) 10:21:18.94
いうければ、ってどこのコトバだよ
0249デフォルトの名無しさん2011/09/10(土) 10:37:44.32
文字列はバイナリデータの部分集合と考えられる。
つまり一般的に

  文字列 ⊆ バイナリデータ

が成り立つ。
これを

  文字列 = バイナリデータ

とするのが、UNIX に古くから伝わるテクニック
で、UNIX 版の Perl は binmode 関数を必要と
していない。binmode 関数はDOS系のOS、あるいは
DOS系OS用スクリプトと互換性を持たせたい場合
に用意されている。
0250デフォルトの名無しさん2011/09/10(土) 10:47:39.10
>>247
テキストデータとバイナリデータの区別はつくのかという一般的な命題?
0251デフォルトの名無しさん2011/09/10(土) 11:31:15.68
>>250
そうそう。文字列はバイナリデータと違ってメタ情報を含んでいる。

バイナリデータは単なるバイトの並びだが、文字列は、文字コードというメタ情報
1文字を構成する要素(1文字=何バイトか)とかそういう情報を含んでいる。

だから、数値はどの文字コードでも1バイトで同じコードであるように(文字コード側が譲歩して)
作られているから数値も文字列で扱うのは可能だけど、少なくともバイナリと文字を見分けるための
型情報が必要になるのではないかと。

数値は同じコードって書いたけどJIS系は同じコードで数値じゃない場合もあるか。
でも、JISは最初は(エスケープシーケンスがでるまでは)ASCIIモードであると定義されているよね。

ということで、バイナリデータを扱うなら全部文字列として扱うってのは不可能でしょ?
型情報が必要になる。
0252デフォルトの名無しさん2011/09/10(土) 11:56:35.15
ばかだなぁ。
メタ情報はおれ達の頭の中にあるんじゃないか。
■ このスレッドは過去ログ倉庫に格納されています