Perl初心者スレ(マジレス回答)
なるほど・・・独自のプログラム記述なんでしょうかね・・・ Perlの変数記述方法じゃないことがわかって少し安心しました もう一回解析してきます >>361 さんの回答で先入観が排除され、 意味がわかりました。 $mes =~ s/_HOGE_/$name/g; 文字列に埋め込まれた_HOGE_を別の変数に代入されてる文字列と置換させていました。 ありがとうございました。 なんでも受け付けるからって、 __HOGE__ をヒアドキュメントとして使ってる人は、単に 特殊リテラルを理解してない人。 質問に超絶遅レスするなら、 __HOGE__は、ほんとうに HOGE と書かれていたなら、 特殊リテラルのまねっこ。 DATA, END などなら、perldoc.jp で perldata から「特殊なリテラル」の項を 参照すること。 ヒアドキュメントのデリミタを print <<die; dieなんてしないよ die ってしたら混乱するでしょ。それと同じレベルで特殊リテラルの 記載に類似(もしくはそのまま)させて使ったら、あかんでしょ。 print <<__END__; dieなんてしないよ __END__ って主旨? 絶対にありえない単語を区切りにしないと、区切りとしての役目にならんだろが __END__を区切りにしてしまったら、__END__という単語が使えなくなるだろ じゃあ __HOGE__ にするわ。絶対ありえん単語だし。 >>368 実行してみろよ、動くぞ。 use strict ; use warnings ; while(<DATA>){ print ; } print <<__DATA__; これがヒア __DATA__ __DATA__ 特殊リテラル ID.パス付きのHPの更新通知プログラムをつくり実行したところ (certificate verify failed)とハマりました。 おそらくSSL関係でつまっています。 簡単に教えてくれる方お願いします。 $mech->get('https://*****' ); ↑指摘されたラインです SSLかと思うのですが、SSLについて知識があまりないため、 ダメだった理由をわかりやすく教えていただけませんか? あと、ユーザーIDやパスワードの前にpitgetを書いてあると どうなるのでしょうか? 説明下手でごめんなさい。 特定のディレクトリ(test)からファイルを読み込む処理を 実装しようと思っています。 while(<./test/*>){ #〜ファイル読み込み処理 } はOKなのに $hoge = "./test/*"; while(<$hoge>){ #〜ファイル読み込み処理 } がうまくいかない理由はなぜなのでしょうか? $hogeを可変にしたいのですがどうすればよいでしょうか? 突然の質問で申し訳ありませんが、宜しくお願いします。 $hoge = "./test/*"; これは文字だからです。(演算子に対するアドレス(ポインタ)ではありません)。 $hoge = "test"; while(<./$hoge/*>) >>373 出来ました!ありがとうございます 今日かなり悩んでいました おかげ様でスッキリしました 下のようにリストのリストを作成したいがcpanか何かで実現できないでしょうか? > (list (list 1 2) (list 3 4)) ((1 2) (3 4)) > (first (list (list 1 2) (list 3 4))) (1 2) > (second (list (list 1 2) (list 3 4))) (3 4) my @car = (1, 2); my @cdr = (3, 4); my @both = (@car, @cdr); print "\@car is @car\n"; # -> @car is 1 2 print "\@cdr is @cdr\n"; # -> @cdr is 3 4 print "\@both is @both\n";# -> @both is 1 2 3 4 printf "%s\n" , $both[0]; # -> 1 printf "%s\n" , $both[1]; # -> 2 printf "%s\n" , $both[2]; # -> 3 printf "%s\n" , $both[3]; # -> 4 Lisper な人? 多分、こういうことをお望みかな。 #!/usr/bin/perl use Data::Dumper; my @car = (1, 2); my @cdr = (3, 4); my @both = ( \@car, \@cdr); print( Dumper( \@both)); ごめん、アクセス方法も書かなきゃね。 #!/usr/bin/perl my @car = (1, 2); my @cdr = (3, 4); my @both = ( \@car, \@cdr); print("$both[0]->[0]\n"); print("$both[0]->[1]\n"); print("$both[1]->[0]\n"); print("$both[1]->[1]\n"); >>377 ありがとう perlのリファレンス表記がこの機会に少し分かりました my @car = (1, 2); my @cdr = (3, 4); my @both = ( \@car, \@cdr); print("$both[0]->[0]\n"); print("$both[0]->[1]\n"); print("$both[1]->[0]\n"); print("$both[1]->[1]\n"); print("@{$both[0]}\n"); print("@{$both[1]}\n"); 971 名前:名無しさん@七周年[] 投稿日:2006/11/11(土) 00:56:10 ID:M8+ahUZV0 自称スーパープログラマー某 強烈加齢臭 メール見ない メール無視 ドキュメント見ない ドキュメント無視 説明聞かない 説明無視 話聞かない 話無視 ガム→むっちゃー むっちゃー むっちゃー むっちゃー 煎餅→バリバリバリバリバリバリ 菓子パン→モグモグモグモグモグモグモグモグモグモグ カップアイス→むっちゃー むっちゃー ペロペロペロペロ フロアすべてに響き渡る 超ばかでかいくしゃみ 当然手でおさえない 異音と異振動 ドスーン!ドスーン! ドカーン!ドカーン! バコーン!バコーン! ズドン!ズドン! 机が近いとマウスポインターが飛ぶ 誤操作誘発 書類だしたりしまうだけでドカンドカン 30秒ごとに口と鼻から異音 ふんっっ! ふんっっ! 備品破壊 貸与P C 破壊 他人のもの破壊 奴の作ったスクリプトとプログラムは使えない バグ製造機 電話や共有携帯電話 キーボードが油ベタベタ 奴に電話とPCとコンソールは触らせてはいけない HTMLファイルの特定文字列を大文字から小文字へ置き換えたいです。 具体的には、name= あれ、途切れちゃったのでダブルクォートでおかしくなったので、無しで書きます。 HTMLファイルの特定文字列を大文字から小文字へ置き換えたいです。 具体的には、name=A10AB を name=a10ab とnameの部分のみ置き換えたいです。 s{ name=" ([^"]+) " }{ 'name="' . lc($1) . '"' }egx >>382 eで関数を使えるんですね。ありがとうございました。 perl コマンドラインからモジュールを読み込みたいんですが、 perl -mM Win32::Clipboard -e "" だと Can't open perl script "Win32::Clipboard": Invalid argument と怒られます。 Perl64\lib\Win32\Clipboard.pm は存在しているのですが・・・ なんで -m と -M 重ねてるの?それと隙間開けずにやってみ -MWin32::Clipboard ↑ perl -mM Win32::Clipboard だと M.pm を読み込んだ後 Win32::Clipboard という名のファイルをperlスクリプトとして実行しようとしてるっぽい >>385 できました。 ありがとうございました。 どうでもいいけど、質問の回答に「なんで○○なの」と質問で返すのはみっともない わからないから質問してるのにね ここは初心者スレだし よっぽど回答に自信が無いように見える なんで? なんで? なんで? ことあるごとに、「なんで」っていうヤツ バカっぽい イライラする ムカツク >>389 「なんで」を追求する楽しさがわからないの? 質問を質問でかえすやついるよな 俺「なぜ変更したんですか?」 先輩「なぜ、その変更に疑問を抱くの?」 ・・・ 文脈にもよるわな マニュアルにはっきり書いてあるようなことと違うことやっているなら「お前ちゃんと読んでないのか?」ってなるし どう説明したら理解できるのか探るためにどう考えてどこに疑問を持ったのか確認することもあるし そういう文脈を無視して 質問したら質問が返ってきた = おかしい は短絡的だね >>392 めんどくさい人って思われてるよw 誰もあんなに聞きにこなくね? perlの本を読んでいると、よく 「スカラーコンテキストでは〜」とか「リストコンテキストでは〜」とありますが どのようなところで、分かるのでしょうか? $a = grep /d/ ,qw<ab cd def>; なんかgrepがスカラーコンテキストで使われていると思うんですが if(grep /d/ ,qw<ab cd def>){} だとなぜスカラーコンテキストだと分かるのでしょうか? shiftjisのファイルを読み込むと「{」が「本」にマッチしちゃうんですがいい方法ありませんか? ファイルを読み込むときにperlに文字コードを教えてあげるとバイト単位ではなくて文字単位で認識してもらえるようになる open my $fh, '<:encoding(cp932)', $file or die $!; 正規表現を含むソースコード全体をUTF8で書き、スコープの上の方で use utf8; と宣言すればスコープ内のコードも文字単位で認識されるようになる >>399 レスありがとうございます。 試してみます。 取り急ぎお礼まで。 以下エラーが出たため、ググると、似たエラーのQ and Aがありました。 Q and A では "if(defined(%hash))"を"if(%hash)"にしろと読めたので、倣うと確かにエラーは解消されました。 理屈はまるで分からないのですが、%記号のついた変数のときだけdefinedを削る理由は何なのでしょうか。 エラー: Can't use 'defined(%hash)' (Maybe you should just omit the defined()?) at ./w3mhelp.cgi line 51. Q and A: https://github.com/bioconda/bioconda-recipes/issues/1254 >>401 すごく古い Perl (例えば 5.005_03) だと、defined %hash はエラーにならず 0 か 1 が返ってきていた。 だが今やこの機能は廃止された。 http://perldoc.jp/func/defined > 集合(ハッシュや配列)への defined の使用は非推奨です。 > これはその集合にメモリが割り当てられたかを報告するのに用いられていました。 > この振る舞いは将来のバージョンの Perl では消滅するかもしれません。 ハッシュ変数自体をスカラーコンテキストで評価すると「利用バケット数/確保バケット数」のような値が 返ってきて、これは昔から変わらない。内容が完全に未定義 = キーが一つも無ければ 0 が返される。 よって if (%hash) { ... } は、意味や挙動的には if (keys %hash) { ... } と同じ。 my %hash; printf "%s, %d\n", scalar %hash, scalar keys %hash; # 0, 0 $hash{udnef} = undef; printf "%s, %d\n", scalar %hash, scalar keys %hash; # 1/8, 1 %hash = (); printf "%s, %d\n", scalar %hash, scalar keys %hash; # 0, 0 http://d.hatena.ne.jp/yumatsumo/20071207/1197002522 ttps://perldoc.jp/docs/perl/5.22.0/perl5220delta.pod#defined40-64array41-32and32defined40-37hash41-32are32now32fatal32errors >defined(@array) と defined(%hash) は致命的エラーになりました >これは v5.6.1 から廃止予定で、v5.16 から廃止予定警告が出力されていました。 v5.6.1は2001年、v5.16は2012年、実際に廃止されたv5.22は2015年にリリース ttps://www.effectiveperlprogramming.com/2016/06/perl-v5-26-new-features/ >A hash is scalar context will return the number of keys, not the hash statistics. 今年リリース予定のv5.26からはスカラーコンテキストのハッシュが返す値はハッシュの持つキーの数になるそうです Perl初心者です。独学でやり始めましたが、わからないことがあり、先輩方、何卒よろしくお願いします。 my $num = 1; my $inc = $num++; print “$num¥n”; print “$inc¥n”; 変数$numは2と表示されますが、変数$incは1と表示さます。こらは仕様でしょうか。変数$incについても2が表示されると思ってたのですが。 C言語では右辺を評価した後に左辺に代入して、2が表示してたかな、と思ったので質問させていただきます。 >>404 Cでも++演算子は同様の結果になると思ったが? >>405 本当ですね。もっと確認してから質問するべきでした。 やりたかったことは $inc = ++$num( でした。C言語と同じですね。 ご教授頂きまして、どうもありがとうございました。 >>406 $inc = ++$num; の間違いです。 僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方 役に立つかもしれません グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』 WVNXN perlやってみたいど素人です。 Ubuntu 18.04がメインのマシンです Windows XPサポート終了後難民となり Ubuntu 16.04に辿りついてます Ubuntuもまだまだど素人ですけど 通常に動かす所まではできます Perlはどこから?始めたらいいでしょう 本買った方がいいのかな? perlやってみたいど素人です。 Ubuntu 18.04がメインのマシンです Windows XPサポート終了後難民となり Ubuntu 16.04に辿りついてます Ubuntuもまだまだど素人ですけど 通常に動かす所まではできます Perlはどこから?始めたらいいでしょう 本買った方がいいのかな? どのみち本は買った方がいいと思うけど 初心者から始めるならこんなのもあるみたいよ(宣伝乙) http://www.perl-entrance.org/ perlに初心者がつくとは。。perlの未来は明るい Perl 6の“Neko operator”を使ってみたいのですがどのように使用すればいいでしょうか。 > 0 ^..^ 9 > say "0 ^..^ 9" などとやっても 0 ^..^ 9 という文字列(?)が返ってくるだけなのですが……。 Perl6は初心者なので全く分からない。 というかやろうとしたことすらないので知識ゼロw >>414 すいませんどなたかこれ分かりませんか。 >>417 perl6はまったく使ったことはないが、 範囲演算子らしいから perl5の ... と同じように使うんじゃないのかね。 say $_ for 0 ^..^ 10; みたいな? perl6の文法的にこれでいいかはわからんけど。 perl5の範囲演算子 ... じゃなくて .. だったね。失礼。 Xorgってperlで描かれてるコマンドが多い気がするけどなんで? なんだろう? 計算式で質問投稿しようとするとNGワードエラーで拒否られてしまう orz 全角でもダメかー >428 の書き込みで、本来続きだった リンク先 >422 の 16進〜解説お願いできませんでしょうか? の文章内だけでもNG含んでるとか・・・・プログラム技術板・・コミュニケーション終わってね? >>428 よくわからないんだけど、下2桁を60で割って3桁目より上は1の位にシフトしているわけだよね。 とするとあり得るのは時間の時と分について 時 * 100 + 分 とやった結果が数値として入っていて、 それの時間単位への変換ではないか? 例えば元の値が 315 なら3時間15分という意味で、それを時間単位に直すと 3.25 時間ってこと。 時と分とは限らないか。分と秒かも知れない。まあしかし下2桁は60進法で考えなければいけないということに変わりはない。 >>428 ところで元のプログラムに「16進バイナリデータを・・・」というコメントが入っているのだろうが、呼び出す側は実際には何を渡している? 仮に元がバイナリだったとしても unpack('N', ...) のようなことをしていない? だとするとそこでバイナリから Perl の 変数への変換自体は終わっている。 つまり、コメントが紛らわしい表現になっているだけ。 >430-432 スミマセンです。 orz もっと詳しく書こうとするとマンゴースレでもブロックされました。 ぶっちゃけ、この中の ttp://motor.geocities.jp/resermail/dc10tools.zip 「dc10mov2csv.pl」内です。 gps_data{'latitude'}の部分からです gps_data{'bearing'}の式は 変換が単精度浮動小数点数(float)のIEEE754 単精度float変換で合ってますか? これをベースに別メーカー機種の同様な構造を持つデータでの他言語の変換プログラムを考えているので。 >>433 pack, unpack の f は機種依存なので IEEE 754 単制度になるかどうかはプログラムからだけではわからない。 http://perldoc.jp/func/pack まあでも今時の普通のPC用Perlならなってそうな気がするけどね。 latitude って緯度か。GPSデータのバイナリをPerlの変数に入れているということだな。 だから下2桁を60進法で考える必要があると。 やはりそのプログラムのコメントは紛らわしいってだけだよ(サブルーチン名も紛らわしいが)。 bin_convert 呼ぶときには既にバイナリから float に unpack されてるから。 で、bin_convert 内でやっているのは先に書いた通り下2桁を60進法で小数点以下の値にしてるってことね。 >>434 ありがとうございます。 全体からずらして抜いたもの60進法にしてるだけなんですね。 てっきりバイナリから浮動小数点を出す特殊計算かと思っていました。 適当にがんばります。 「サンプル」のCSVを文末の「結果」に変換するプログラムをPerlで作りたいです。 ● サンプルのCSVの構造: 1コラム目:数字8桁の昇順、2コラム目:数字1桁、3コラム目:文字列 ● 作りたいプログラム: 1コラム目、3コラム目は保持する。複数レコードで1コラム目に重複があれば、 それらの複数レコードの2コラム目の1桁数字を連番にする。 1コラム目に重複がない場合は、当該レコードの2コラム目を1にする。 ● 「サンプル」 06030002,6,文字列A 06030004,3,文字列B 06030004,4,文字列C 06030004,5,文字列D 06030005,3,文字列E 06030005,4,文字列F 06030006,3,文字列G 06030006,4,文字列H 06030006,7,文字列I 06030007,3,文字列J 06030008,3,文字列K ● 「結果」 06030002,1,文字列A 06030004,1,文字列B 06030004,2,文字列C 06030004,3,文字列D 06030005,1,文字列E 06030005,2,文字列F 06030006,1,文字列G 06030006,2,文字列H 06030006,3,文字列I 06030007,1,文字列J 06030008,1,文字列K まずは自分で書いてみたコードを晒すところからだな。 一行プログラムが思い浮かんだ。 最初の列をハッシュのキーにして3列目をpush。 全部読んだらキーをソートして読んだ内容に番号降りつつ出力。 しかし俺は今電車の中からスマホで書いてるのでここに書く気が起きない。 Ruby で作った require 'csv' count = Hash.new( 0 ) # 初期値は、0 # コロン区切りのCSV 入力ファイルを、1行ずつ処理する CSV.foreach( "input.csv" ) do |row| count[ row[ 0 ] ] += 1 row[ 1 ] = count[ row[ 0 ] ] puts row.join( "," ) end 考え方は >>439 と同じ perl -pe "s/^([^,]+,)[^,]+/$1.++$count{$1}/e" < sample.csv my @y = ""; while(<>) { my @x = split ","; # $x[1] = $x[0] eq $y[0] && ++$y[1] || 1; $x[1] = $x[0] ne $y[0] || ++$y[1]; print join ",", (@y = @x); } ウチでやるならこうかしら おはよう。 元のテキストが s.txt に入っているとして、こうする。 perl -ne 'chomp;@d=split/,/;push(@{$h{$d[0]}},$d[2]);END{for(sort keys%h){for($i=0;$i<@{$h{$_}};$i++){print join(",",$_,$i+1,$h{$_}[$i])."\n"}}}' s.txt なげーなw あ、そうか。貯め込む必要はなくてハッシュ作ってそのまんま出せば良いんだよな。 じゃあawkの方が楽ではないか? awk -F, 'BEGIN{OFS=","}{n[$1]++;print $1,n[$1],$3}' s.txt 436です。皆様ありがとうございました。 自分では1行ずつ処理することまでしかできず、複数レコードの 1コラム目の比較をすることができませんでした。 おかげさまで体育の日に子供の運動会に行けます! ありがとうございました! 上の方のレスにも関連したものがありますが、 ファイルから読み込んだ文字列データにて パターンマッチがヒットしません。 同一文字列を直接コード内に定義すると、ヒットします。 出来ればファイルに切り出したいので、 ご教示いただけますでしょうか。 [環境] Activeperl win8.1 or 2016 server perl -v This is perl 5, version 24, subversion 3 (v5.24.3) built for MSWin32-x64-multi-thread [コード utf-8で作成] #res[1]にはcp932のコードの「テスト」を含む文字列が格納されている。 $res[1] = Encode::decode('cp932', $res[1]); #patern.txtはutf-8で「テスト」の文字列が格納されている。 open (FILE, "<:utf8", "patern.txt") or (die "$!"); my $line = <FILE>; close(FILE); #$line = 'テスト';←#を外して直接コードに書くとヒットする。 print encode('cp932', $line);(正常に取得できている。) if ($res[1] =~ /$line/){ print "Hit!"; } else{ print "not Hit"; } ---出力--- >テスト >not Hit たぶんそれだな。$line の中身が "テスト\r\n" または "テスト\n" になってそう。 遅くなりすみません。 テストファイルには改行を入れていなかったのですが、 chompが必要なのですね。 ファイルからレコードを取得するにはchompが必要と勉強になりました。 ありがとうございました。 >>450 いや、改行は入っていると思うぞ。でなければあのプログラムでは一致する。 ところでUTF-8にBOMってなんか意味あるの? ビッグエンディアンで上のビットから詰め込んで並べている1パターンしかないよね? >>453 あるよ、BOMがあればUTF-8だと文字コードを 簡単に判定できる つまり、文字化け防止に役立つ みんなBOM付けるようにすれば良かったんだけどな >>450 ですが、改行が入っていました。 遅くなりすみません。 すみませんでした。確認をしっかりします。 もう一つ質問があるのですが、>>450 の環境にて、パターンマッチングを、全角、半角、ひらがな、カタカナ、大文字、小文字を区別することなく行いたいのですが、方法をご教示いただけますでしょうか。 >>456 手順としてはまず比較に都合のいいように比較する側とされる側の文字列を正規化する。 例えば半角は全て全角にし、濁点や半濁点はそれを含んだ文字にし、英小文字は大文字にする。 それから比較を行う。 ただし使われている文字がASCIIの文字だけならば // のオプションで i が使えるので正規化不要。 教えて下さい。 my @str4=['a','b','c','d','e']; my $ref4=\@str4; print $str4[0][1],"\n"; # b print @{ $str4[0] },"\n"; # abcde ref4を使って同様に b と abcde を表示するには、どうしたらいいですか? うっかり自己解決しました。数時間悩んだのに。 print @{ ${ $ref4 }[0] }; print @{ ${ $ref4 }[0] }[1]; >>457 オプションで可能であればと思ったのですが、マッチング文字列と対象を同じ文字種にしないといけないんですね。 ActivePerlでUnicode::Japanese でUTF8から変換して書いてみたのですが、cp932にencodeすると、化けてしまい、使用できませんでした。 ActivePerlで使用可能なモジュールあればコードではなくてかまいませんので、何かあれば紹介してもらえますでしょうか。 UNICODEにはcomposed、decomposedというややこしいものもあるんだよね。 https://pointoht.ti-da.net/e8205606.html Unicode::Normalizeってのがあるけど、日本語を特別扱いしてくれたりはしなさそうな予感。 read.cgi ver 07.5.4 2024/05/19 Walang Kapalit ★ | Donguri System Team 5ちゃんねる