Perl初心者スレ(マジレス回答)
引数で渡す sub foo { my ($arg, $count) = @_; ...; foo($arg, $count) if $count++ < 10; } ありがとーーー。 複製される変数の数には変わりがないよね、たぶん。 上はグローバル変数と言うのが気に入らなくて、下は引数で扱う値が増えるのが気に入らないが。 while(@all){ ((shift @all) eq 'cut') and last; } whileを修飾子として書くと落ちるんだが誰か理由を教えてくれー ((shift @all) eq 'cut') and last while(@all); evalでも落ちた 英数混じった文字列の中から2桁の数字にマッチさせたいのですが、 /\d\d/だと3桁以上の数字の前2桁にもマッチしてしまいます。 /^(\d\d)\D|\D(\d\d)\D|\D(\d\d)$|^(\d\d)$/ こんなことするより簡単な方法ないでしょうか? % perl -le 'print q{22} =~ /[^\d]\d{2}[^\d]/' % perl -le 'print q{22} =~ /(?<!\d)\d{2}(?!\d)/' 1 % perl -le 'print q{22} =~ /(?:^|\D)\d{2}(?:$|\D)/' 1 /(?<!\d)\d{2}(?!\d)/ これが期待通りの結果が得られました。 (?<!)とか(?!)とかこれまで使ったこと無かったので勉強になりました。 ありがとうございました。 以下のような日付が下から上に並んでいるoriginal.txtがあるとします。 これを、日付を逆順にしたoutput.txtに整形するプログラムを作りたいです。 Windowsで、Batch fileとPerlで作れたらと考えています。よろしくお願いします。 <original.txt> ########## 20141203 ########### DNINITIENK FDKHJKDKKSK ・・・・・ ########## 20141202 ########### TUNINJKDF NIGHALKDK ・・・・・・ ########## 20141201 ########### ABCDEFGHIJKE LMNOPQRSTUV ・・・・・ <output.txt> ########## 20141201 ########### ABCDEFGHIJKE LMNOPQRSTUV ・・・・・・ ########## 20141202 ########### TUNINJKDF NIGHALKDK ・・・・・・ ########## 20141203 ########### DNINITIENK FDKHJKDKKSK ・・・・・・ >>332 \bだと英字と数字の境目は単語の区切りにならないみたい。 centosで元から入ってるperlとは別にソースインストールしたperlを別に入れました。 新しくインストールしたperlで以前から入っていたCPANモジュールを使いたい場合、再度入れなおす必要ありますか? >>334 perl -Mvars=%h -ane '$a = $F[1] if @F == 3 ; $h{$a} .= $_ }{ print $h{$_} for sort { $a <=> $b } keys %h’ original.txt >>336 モジュールの共用は避けるべき >>334 use 5.016; use warnings; my $boundary = qr/^#+\s+\d+\s+#+\s*$/; open(my $in, "<", "original.txt") or die; my @data; my $chunk = ''; while(<$in>){ if (/$boundary/ and (length($chunk) > 0)){ push @data, $chunk; $chunk = ''; } $chunk .= $_; } if (length($chunk) > 0){ push @data, $chunk; } $in->close; open(my $out, ">", "output.txt") or die; $out->print(reverse @data); $out->close; 単純に逆にするだけか perl -00pe '$_ = join q{}, reverse ( split /(?=^#)/m)' my $initial_title_ = "\$" . "$initial_threads" . "_begin"; $initial_title_ = eval $initial_title_; 1行に短くなりませんか? my $initial_title_ = eval "\$${initial_threads}_begin"; こういうこと? >>342 ありがとう eval使うのが3つあったから 6行が3行になったよ $seach_wordに日本語を入れたいのですが、それだとマッチしません。どうすればよいでしょうか? w3m -dump -cols 160 http://peace.2ch.net/test/read.cgi/tech/1349538519/ | ~/Perl_instance/resSearch.pl #!/usr/bin/env perl use strict; use warnings; use utf8; my $seach_word = ">1" ; my $found_res = 0; my $res = ""; while (<>) { if (/^\d/x) { # out put, flash if ( $found_res == 1 ) { print $res; $found_res = 0; } $res = ""; } else { # searching if (/$seach_word\b/x) { $found_res = 1; } } # buffer lines $res .= $_; } あ、 binmode STDIN , ":utf8": で binmode STDIN , ":utf8"; binmode STDOUT , ":utf8"; my $seach_word = "日本語" ; で同様のコマンド叩いて、つまり344が拾えるはずが 何故かヒットしません <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> w3m -dump -cols 160 http://peace.2ch.net/test/read.cgi/tech/1349538519/ |nkf -g UTF-8 UTF-8しか扱わないのにちょっとエンコード回りは複雑だ webサイトの表形式データ(横方向は5列、縦方向は不定で100行ぐらい)を取得するのに、 正規表現の繰り返しマッチング m//g を使って、結果を配列に入れてるんだけど、 もっと簡単に取ってくるモジュールはないでしょうか? >>350 >webサイトの表形式データ の形式が分からんとなんとも。 >>346 ヒント助かった。 use Encode qw/encode decode/; my $enc = 'UTF-8'; sub d($) { decode($enc, shift) } sub e($) { encode($enc, shift) } my $seach_word = "日本語"; my $found_res = 0; my $res = ""; while (<>) { if (/^\d/x) { if ( $found_res == 1 ) { print $res; $found_res = 0; } $res = ""; } else { my $seach_word_ = e$seach_word; if (/$seach_word_/x) { $found_res = 1; } } $res .= $_; } >>350 >>351 例えば、こんな表です http://ke.kabupro.jp/hist/20150107.htm 今はHTMLのソースを見て、証券コードを正規表現で抽出するために、 =~ m!<tr><th><a\shref[^>]+>(\d{4})<\/a>!ig などとして配列へ入れているのですが、泥臭いです。 もっとスマートに取得できるモジュールは無いかと思った次第です。 (続き) 例えば統計計算用のRでは readHTMLTableというモジュール(パッケージ?)があり、表形式のデータを含んだurlを指定すれば、簡単に取得出来るのですが。 >>353 HTML::TableExtract http://search.cpan.org/ ~msisk/HTML-TableExtract-2.12/lib/HTML/TableExtract.pm Web::Scraper http://search.cpan.org/ ~miyagawa/Web-Scraper-0.38/lib/Web/Scraper.pm my $tmp = { $a => sub { $_ = 処理A}, $b => sub { $_ = 処理B}, $c => sub { $_ = 処理C}, }; ループ中に↑のように書いている場合、一つの変数に対して複数の処理($a に 処理A' を追加)を 加えたい場合、どのように書くのでしょうか? 凄い初歩的な質問だと思うのですが真剣に行き詰まってます 教えてください _HOGE_ こんな表記の変数ってなんて表現するんですか? またネットでこういう変数について調べたいときは、 どのように検索したらヒットしますでしょうか。 Perl __ で検索しても全然それらしい記事が発見できず _HOGE_は変数じゃないからヒットしないのが正解 もしかして:ヒアドキュメント なるほど・・・独自のプログラム記述なんでしょうかね・・・ 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の範囲演算子 ... じゃなくて .. だったね。失礼。 read.cgi ver 07.4.7 2024/03/31 Walang Kapalit ★ | Donguri System Team 5ちゃんねる